본문 바로가기
Wargame Write-Up/HackCTF

[HackCTF] (Reversing) Strncmp 풀이

by snwo 2020. 3. 3.

문제를 다운받아 실행해보자

 

아무거나 입력하면 Always dig depper 이라 출력하고 종료한다. 항상 삽질하라는 충고같다.

 

 

rsi, rdi (입력값) 을 인자로 주고있다. 그렇다면 rsi 를 확인해보자

 

 

main+188 에 BP 를 걸어 rsi 값을 확인해보자

 

이상한 문자열이 나온다. 이걸 입력해보면

 

Good game이라고 나온다. 하지만 이게 flag가 아니라는걸 알수있다. 힌트로 준것처럼 계속 삽질을 해보면

위에 나온 strcmp 함수 뒤에 _ 이 붙어 사용자가 작성한 함수인걸 알수있다. 한번 확인해보자

 

    [loc_400712]

 

문자열에서 하나씩 값을 가져와 key와 xor 후 다시 s (사용자 입력 문자열) 에 덮어쓴다.

(덮어쓰는것처럼 보이지만, gdb로 삽질하여 확인한 결과 값을 덮을려했지만 const로 선언됐는지 

덮어써지지는않았다.)

그리고는 내부에서 strncmp 로 s2와 s1을 비교하고 리턴한다.

 

그렇다면 이제 key를 구해보자

 

    [key]

 

꼼수를 이용하자면 FLAG는 HackCTF{ ~  형식으로 되어있기때문에 H 와 xor 해서 얻을수있지만, 

리버싱실력을 높이기위해 key를 직접 찾아봤다.

 

함수리스트에 check함수가 있었다. 여기서 key를 생성하고 main을 호출하는걸 볼 수 있다.

key는 _atoi로 값을 가져와 eax * ( eax - 0xE ) = 0xFFFFFFCF 을 만족하는값을 key로 정한다.

10진수로 해석하면 eax * ( eax - 14 ) = -49 를 만족해야한다. 7*7은 49이니 7을 넣어보면 식이 풀린다.

이제 key도 알았으니 복호화코드를 만들어보자

 

    [복호화 소스]

 

1
2
3
4
5
6
7
8
9
s="OfdlDSA|3tXb32~X3tX@sX`4tXtz"
len=0x1C
key=7
flag=""
for i in range(0,len):
    flag+=chr(ord(s[i])^key)
 
print flag
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

flag가 나온다. strncmp 을 실행해 flag를 넣어주면 Good game이 떠야 정상이지만, 아까말한대로

const로 선언돼있는지 값이 바뀌지않아 Good game이 나오지않는다.