이휘원선배님께서 내주신 숙제
힌트를 보고서야 풀 수 있었다ㅜㅜ
TYPE CONFUSION+OFF BY ONE
여기서, 1을 선택할 경우 (add ascii art)
이 3가지는 옵션이 된다. 3가지중 아무거나 선택 후
입력을 받게 된다. 여기서 0xF7(247)자를 읽는다.
여기서 3을 선택한 경우,
id 입력 후,
4가지가 나오는데,
add comment를 할 경우,
comment를 입력 받는데 0xFC(252)자를 받는다.
즉, 입력을 받을 때 ascii art와 comment 2가지가 있다.
이런식으로 박히는데,
2가지 case가 있다
0x0804bX08부분에 박힌다.
ascii art
0x0804bx08: 0x49->id->0x00*3->옵션주소(옵션1: 0x08048c60, 옵션2: 0x08048b9f)->0x0804bX11부터 input
0x0804b108-0x0804b011=247
comment
0x0804bx08: 0x37->id->0x00*3->0x0804bx0d부터 input
0x0804b108-0x0804b00d=251
여기서 문제는, comment에서 input이 시작되는 부분부터 다음 0x0804bx08까지 251칸인데, comment는 252자를 받는데에 있다.
따라서, 한글자를 더 써서 0x37 -> 0x49, 0x49->0x37을 할 수 있다.
ascii art에서 박힌 옵션 주소는 apply filter할 경우, 실행이 된다.
여기서 보면, call eax에서 실행이 된다.
remove all comments를 하면,
해당 ID의 0x37이 지워진다.
ID가 2인것의 comments를 지우면 0x804b208에서 볼 수 있듯이 0x37이 지워진다.
여기서, 새로운 것을 넣어보자
0x49혹은 0x37이 없는 데부터 들어간다. 즉,여기서는 0x0804b208에 들어간 것이다.
이런 식으로 위에 덮어진다.
0x49혹은 0x37이 없는 것은 어떻게 판별할까?
0x8048898에서 test eax, eax에서 그 부분(0x37, 0x48가 들어가는 부분)이 00인 것은 0x80488b6으로 점프하지 않고, 0x804889c로 넘어가게 되서 가능하다!
그러면, 일단
ascii art1
ascii art2
comment 1
comment 2
ascii art3
를 만든다.
(a) comment 2 remove -> add comment 3로 만든다.
(b) comment 1 remove -> add comment 1을 만들면서 251자쓰고+0x49를 한다.
그러면, 원래 comment 2였던 부분은 (a)과정에서 id가 3가되고, (b)과정에서 0x37->0x49가 된다.
그리고나서, art3을 apply filter한다.
add comment3에서 input 준 부분이 eip가 된다.
0x0804bx08: 0x37->id->0x00*3->0x0804bx0d부터 input
0x0804bx08: 0x49->id->0x00*3->옵션주소(옵션1: 0x08048c60, 옵션2: 0x08048b9f)->0x0804bX11부터 input
1->1->\n
1->1->\n
3->1.->1->\n->0
3->2->1->\n->0
1->1->\n
3->2->2->0
3->3->1->ABCD(control eip)->0
3->1->2->1->A*251+I(\x49)
3->3->3
eip가 ABCD로 control됨을 확인 할 수 있다!!