본문 바로가기
시스템 해킹/cykor

chal2

by sonysame 2016. 12. 31.

이휘원선배님께서 내주신 숙제

힌트를 보고서야 풀 수 있었다ㅜㅜ

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

이, 옵션주소가 되고, apply filter하는 순간, call eax에 의해 eip를 control할 수 있게 된다.

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됨을 확인 할 수 있다!!


'시스템 해킹 > cykor' 카테고리의 다른 글

dethstarr  (0) 2017.03.11
how2heap/poison_null_byte.c  (0) 2017.01.01
chal1  (0) 2016.12.29
HEAP  (0) 2016.12.24
ssp  (0) 2016.12.14