문제를 다운받아 실행해보자
아무거나 입력하면 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이 나오지않는다.