티스토리 뷰
golem.c
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer!
memset(buffer, 0, 44);
memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}
golem은 모든 버퍼를 다 비워버렸다.
그래서 LD_PRELOAD를 사용하여 문제를 풀었다.
먼저, 임의로 소스를 짠 뒤 공유 라이브러리로 컴파일을 한 다음
LD_PRELOAD로 지정한다.
그 후, 모든 memset을 끝낸 다음 리턴하는 부분을 브레이크 포인트로 잡은 다음 실행하였다
그다음 메모리값을 확인하였고, 경로가 남아있는 주소를 확인 할 수 있었다.
0xbffff684
buffer와 sfp 총 44byte를 nop로 채운 뒤 ret에 아까 찾은 경로가 남아있는 주소를 넣었다.
bfffff84부터 주소를 올린 결과 bffff69a에서 성공하였다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL13 (darkknight -> bugbear) : RTL1 (0) | 2013.07.19 |
---|---|
LEVEL12 (golem -> darkknight) : sfp (0) | 2013.07.19 |
LEVEL10 (vampire -> skeleton) : argv hunter (0) | 2013.07.19 |
LEVEL9 (troll -> vampire) : check 0xbfff (0) | 2013.07.19 |
LEVEL8 (orge -> troll) : check argc (0) | 2013.07.19 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday