티스토리 뷰
darkknight.c
#include <stdio.h>
#include <stdlib.h>
void problem_child(char *src)
{
char buffer[40];
strncpy(buffer, src, 41);
printf("%s\n", buffer);
}
main(int argc, char *argv[])
{
if(argc<2){
printf("argv error\n");
exit(0);
}
problem_child(argv[1]);
}
darkknight는 argv에 입력한 값의 41byte만을 buffer에 복사하였다.
40byte는 buffer를 채우고 나머지 1byte는 buffer 다음에 위치하는 sfp의 주소가 변경 될 것인데 어떻게 변경되는지 gdb를 이용해 확인해보았다.
buffer는 15byte의 nop와 25byte의 쉘코드로 채우고 나머지 1btye는 \xaa로 넣었더니 sfp의 주소가 bffffaaa 로 되있는 것을 볼 수 있었다.
그래서 buffer의 주소를 찾은 다음 sfp의 주소를 buffer의 주소로 변경해 problem_child함수가 끝나고 돌아갈 때 buffer로 돌아가도록 하기로 하였다.
위의 gdb에서 buffer 앞부분의 어딘가의 주소가 bffffaa4였으므로 bffffaa4를 이용하기로 하였다.
주소를 내려가면서 확인한 결과 bffffa98에서 성공할 수 있었다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL14 (bugbear -> giant) : RTL2, only execve (1) | 2013.07.19 |
---|---|
LEVEL13 (darkknight -> bugbear) : RTL1 (0) | 2013.07.19 |
LEVEL11 (skeleton -> golem) : stack destroyer (0) | 2013.07.19 |
LEVEL10 (vampire -> skeleton) : argv hunter (0) | 2013.07.19 |
LEVEL9 (troll -> vampire) : check 0xbfff (0) | 2013.07.19 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday