-
여기서 보면, 함수가 특별한 점이 있는 데, 함수의 주소를 0xC39000C6으로 바꾸는 것과, 0x6E8로 바꾸어 버리는 부분이다. 그런데 0xC39000c6의 경우 어셈블리 코드로는 eax가 가리키는 곳을 0x90[nop]로 바꾸고 ret하는 것이다.
그리고 저 hmmm___가 0x6e8로 바꾸는 부분은 이후에 hmmm함수가 실행되거나 하지 않기에 신경쓸 필요 없을거 같다.
아마도, 바꾼거를 가리기 위해서 만들어주는 부분인듯
그래프로 보면 이렇게 되어있는 데, 이부분에서
0x401071을 nop로 바꾸어 버리면 될거같다.
즉 hmmm함수를 바꾸기 전에 eax를 0x401071로 바꾸어놓으면 될거로 보인다.
여기서 보면 input을 eax에 넣어주기 때문에, call hmmm__ 하나만 잘 확인하면 될듯
hmmm에 가면, 먼저 0x40467a에 가서 406016에다가 0x619060eb를 적고,
** 이부분은 쓸데 없는 데, 코드 쓰는 과정에서 어쩔수 없이 생긴듯
input을 1 증가시킨다. 이후 다시 돌아오면 바로 input_1up에 또다시 가게 되어서 input을 1 증가 시킨다.
이후 리턴은 0x404674로 가게된다.
가보면 input에다가 601605C7을 더한다. 그다음, eax를 1증가시키고 bl에 ch를 넣고, 모두 push하다가 pop을 하고 난후 다시 input을 1 증가시킨다. 또 아까처럼 input으로 가서 1을 한번 더 증가시킨다. 이후 ret은.... 생각하기 힘드니 디버깅해보자.
스택을 보니 다시 원래 함수로 돌아가는 군.
그 이후 eax에다가 input의 값을 집어넣는다.
그러니까 정리하자면, input값에다가 0x601605c7을 더하고 4를 더한다. 그 값을 EAX에 넣는다.
X + 0x601605c7 + 4 = 0x401071 이 되면 될듯하다...
그러면 X는 0xA02A0AA6(-1,607,857,498) 이 된다. 그런데... 음수가 불가능하니까 integer overflow를 이용해서 값을 적어주자.
즉 X + 0x601605c7 + 4 = 0x100401071 이 되면 된다 ㅇㅇ..
X = 0xA02A0AA6(2,687,109,798)
ㅋㅋㅋㅋㅋ 16진수로 보면 똑같네.. 당연한건가...
끝
쉽네
'Writeup > Wargame_Writeup' 카테고리의 다른 글
[Reversing.kr] 11_Easy ELF (0) 2020.02.05 [Reversing.kr] 6_ImagePrc (0) 2020.02.05 HackCTF j0n9hyun's secret (0) 2020.01.23 HackCTF Unexploitable #2 (0) 2020.01.23 [Flare-on 2019] Reloadered (0) 2020.01.21 댓글