Phantom

Replace 본문

Pwnable/Reversing.kr

Replace

Ph4nt0m_ 2017. 11. 20. 20:27
반응형


이번 문제는 Replace이다.

글자는 입력이 되지 않고 숫자만 입력이 된다.

그리고 Check를 누르면


에러가 떠버린다.

우선 이게 뭐로 짜여진건지 봐야겠다.


C++로 짜여져 있다.

이건 Wrong을 Correct로 바꾸는 문제같은데..

일단 헥스레이를 이용한다.

우선 보니 입력과 출력함수에 대해 BP를 건다


GetDigItemInt의 리턴값은 입력한 값을 16진수로 리턴한다



분석을 하면 이렇다.

우선 값을 11111을 넣고 Check를 누르면 함수의 RET값으로 0x2B67을 리턴한다.

그리고 아래 함수에 들어가게 되면


Correct를 저장하고 0x4084D0에 있는 입력값을 2 증가시킨다.


후에 0x40466F함수를 실행하고 0x4084D0에 0x601605C7을 더하고 +1 증가시킨다.
0x4084D0는 입력값이고 입력값에 0x601505C7을 더하고 +1 증가시킨다.


그렇게 메인으로 돌아와 EAX를 XOR로 초기화 하고 0x404690으로 JMP하면


이 구문이 보이게 되는데. 아까의 값을 다시 EAX에 넣고 Push한다.

그러면 값은

Input + 2 + 0x601605C7 +2 = 0x60163132

음....어찌되었든 계속 엑세스 불가능한 곳으로 0x90을 넣어서 강제종료가 된다.

당연히 Correct로 뜨지않는다.

JMP문을 NOP로 바꿔도 바뀌지않는다.. 음...

우선 이상한곳에 엑세스하는것은 NOP처리해보고.........?!

아니다 이상한곳이아니라 Input값과 0x601605C7+4 => 아무것도입력안했을때는 0x601605CB

Input + 0x601605CB = 정상 주소이면 되는거 아닐까?



JMP문 두개를 벗어나서 0x401073이라면?? 값을.. Input값은 어떻게 되는거지?

Input = 0x401073 - 0x601605CB
Input = A02A 0AA8

result = A02A0AA8 + 0x601605CB = 1 0040 1073
0x401073으로 JMP할 수 있다.

A02A0AA8은 10진수로 2,687,109,800 이다.

아.....이렇게 두개를 jmp하려니 에러가 떴다.



조금 도움을 받으려 라업을 보니 71로 점프해야하더라.

그렇다면.. 위의 값에 -2만하면된다.

A02A0AA6이고 10진수로 2,687,109,798이다.



와...혼자만으로는 푸는데 조금씩 조금씩 어려움이 있는듯 싶다..

아 어렵긴한데 뭐랄까...표현을 못하겠다
반응형

'Pwnable > Reversing.kr' 카테고리의 다른 글

Reversing.kr Easy_KeyGen  (0) 2019.06.25
Reversing.kr Easy_Crack  (0) 2019.06.25
Easy_ELF  (0) 2017.11.20
Music Player  (1) 2017.11.20
Easy_UnpackMe  (0) 2017.11.17
Comments