R's Hacking Daily Log

Leviathan1 -> Leviathan2 (version2) 본문

OverTheWire/Leviathan

Leviathan1 -> Leviathan2 (version2)

hanhxx 2023. 1. 11. 15:47

이번에는 ltrace가 아닌 r2 command로 leviathan1 level을 풀어보자. 

ltrace command는 문제를 간단하게 한 번 풀어보자의 느낌이라면,

r2 command는 좀 더 문제를 분석적으로 접근해서 해결하는 방법이다. 

 

 

Kali linux - Terminal ] 

r2 command로 check 파일을 분석하고, 

afl (= analysis function list )를 이용하여 함수를 쭉 띄운다. 

 

 

 

중간에 main function이 있는 걸 확인할 수 있다. 

main function의 내용을 좀 더 구체적으로 확인해 보자. 

pdf @main

 

 

 

읽다 보면 call 뒤에 함수 이름이 나오는 걸 볼 수 있다. 

call "function name"

해당 함수를 호출하는 의미이다. 

 

그중에서 strcmp()은 두 문자열을 비교해 주는 함수이고,

여기서 s1과 s2를 비교하는 거 같다. (push로 두 값을 stack에 넣어주는 걸 볼 수 있음)

 

 

strcmp()에 breakpoint를 걸어주고 실행하여 0000값을 password로 넣어보았다. 

 

 

다시 main function 내용을 확인해 보면 breakpoint가 잘 걸려있는 걸 볼 수 있다.

breakpoint가 걸리면 처음 code부터 실행하다가 point 부분에서 딱 멈추게 된다. 

 

 

 

그렇다면, 이제 stack의 내용을 확인해서 어떤 값이 있는지 볼 수 있을 것!

stack 내용을 보면 s1, s2의 값을 볼 수 있는데, 각각 e4d4ffff, e8d4ffff이다. 

 

 

사실 이 값은 s1,s2에 저장된 문자열이 아니라, 문자열이 저장된 위치를 알려주는 포인터 값이다. 

따라서 이 값을 읽으면 저장된 s1, s2의 값을 알 수 있다. 

 

 

이때, stack에 뜨는 대로 읽어서는 안 된다. 

e4d4ffff 0xffffd4e4
e8d4ffff 0xffffd4e8

 

이제 해당 위치에 어느 값이 있는지 확인해보자.

-offset- 에서 0xffffd4e0으로 시작하는 열, D4~D7의 값을 보면, "3030 3000"

같은 열에서 D8~DB의 값을 보면, "7365 7800"이다. 

 

 

이 값은 ascii code로, 오른쪽에 string으로 나오는 내용을 보면 바로 어떤 문자인지 확인할 수 있다. 

303030
000
736578 sex

아마 check 파일은 입력받은 값 중에서 3자리만 다루는 듯하다. 

첫 번째 값은 password로 입력한 0000 중 000이고,

두 번째 값은 입력해야 하는 password, "sex"라는 것을 알았다. 

 

 

check를 실행해서 password를 입력해 보니, shell을 얻었다. 

stack에서 확인한 내용이 맞았나 보다. 

 

 


 

ltrace를 사용했을 때와 달리, 코드를 하나하나 확인하면서 접근하여 문제를 풀어보았다. 

더 어려운 느낌이긴 하지만, 코드 내용을 이해하면서 해결하니 문제를 제대로 해결했다는 느낌이 든다!

 

 

 

'OverTheWire > Leviathan' 카테고리의 다른 글

Leviathan7 -> Leviathan8  (0) 2023.01.07
Leviathan6 -> Leviathan7  (0) 2023.01.07
Leviathan5 -> Leviathan6  (0) 2023.01.07
Leviathan4 -> Leviathan5  (0) 2023.01.07
Leviathan3 -> Leviathan4  (0) 2023.01.06
Comments