티스토리 뷰

 

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

 

buffersfp 44bytenop로 채운 뒤 ret에 아까 찾은 경로가 남아있는 주소를 넣었다.

bfffff84부터 주소를 올린 결과 bffff69a에서 성공하였다.

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday