전 문제들에 비해 새로 바뀐 부분이 argv[1][46]이 ‘\xff’가 되면 안된다.
그러니까 즉 argv[1]의 주소가 0xbfff****가 되면 안되고 0xbf******여야 한다는 건데 그렇담 argv[1]의 주소를 0xbffeffff이하로 받아야한다.
메모리 구조를 보면 커널영역이 1GB이므로 0xbfffffff부터 쌓인다. argc ,argv는 낮은 주소에서부터 쌓이기 때문에 argv[2]의 크기가 0x10000 이면 argv[1]의 주소는 0xbffeffff이하가 된다.
0x10000 = 65,536
메모리 구조
LOW | buffer(40byte) | SFP(4byte) | RET(4byte) | argv[1] | argv[2] | HIGH
argv[1]에 쉘코드를 넣고 RET값을 buffer의 주소로 한다.
buffer의 주소를 확인하기 위해 strcpy가 실행된 직후까지 브레이크 포인트
r `python –c’print“\xbf”*48’` `python –c’print“A”*65536’`
buffer의 주소 : 0xbffefae0
argv[1],argv[2]의 주소
그런데 자꾸 buffer의 주소를 이용하여 ret를 하려하니 세그멘테이션 폴트가 떠서 RET를 argv[1]의 주소로 돌렸다.
'LOB' 카테고리의 다른 글
LOB 11번(skeleton → golem) (0) | 2016.10.04 |
---|---|
LOB 10번(vampire → skeleton) (0) | 2016.10.04 |
LOB 8번(orege → troll) (0) | 2016.10.04 |
LOB 7번(darkelf → orge) (0) | 2016.10.04 |
LOB 6번 (wolfman → darkelf) (0) | 2016.10.04 |