티스토리 뷰
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
// the inspector
int check = 0;
void MO(char *cmd)
{
if(check != 4)
exit(0);
printf("welcome to the MO!\n");
// olleh!
system(cmd);
}
void YUT(void)
{
if(check != 3)
exit(0);
printf("welcome to the YUT!\n");
check = 4;
}
void GUL(void)
{
if(check != 2)
exit(0);
printf("welcome to the GUL!\n");
check = 3;
}
void GYE(void)
{
if(check != 1)
exit(0);
printf("welcome to the GYE!\n");
check = 2;
}
void DO(void)
{
printf("welcome to the DO!\n");
check = 1;
}
main(int argc, char *argv[])
{
char buffer[40];
char *addr;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// you cannot use library
if(strchr(argv[1], '\x40')){
printf("You cannot use library\n");
exit(0);
}
// check address
addr = (char *)&DO;
if(memcmp(argv[1]+44, &addr, 4) != 0){
printf("You must fall in love with DO\n");
exit(0);
}
// overflow!
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer
// 100 : extra space for copied argv[1]
memset(buffer, 0, 44);
memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));
// LD_* eraser
// 40 : extra space for memset function
memset(buffer-3000, 0, 3000-40);
}
succubus는 DO에서 GYE로 GYE에서 GUL로 GUL에서 YUT으로 YUT에서 MO로 가서 쉘을 띄워야했다.
우선, DO함수의 주소를 buffer 40 + SFP 4byte 다음에 위치하는 ret 4byte위치에 넣어야했기 때문에 DO함수의 주소를 찾아보기로 했다.
DO 함수의 주소: 0x80487ec
DO함수의 주소가 맞는지 확인
GYE,GUL,YUT,MO도 차례대로 주소를 찾았다.
GYE : 0x80487bc
GUL : 0x804878c
YUT : 0x804875c
MO: 0x8048724
찾은 주소를 이어서 공격했더니 MO함수까지 간 것을 확인 할 수 있었다.
이제 /bin/sh만 인자로 넘겨주면 된다.
MO함수의 주소 다음 쓰레기 4byte를 채워 넣고 /bin/sh가 있는 곳의 주소를 넣으면 된다.
이런식으로 공격코드를 짜고, buffer의 시작주소를 구해 /bin/sh가 들어있는 주소를 구해보기로 했다.
bffffa50에서 buffer 40byte + SFP 4byte + DO 4byte + GYE 4byte + GUL 4byte + YUT 4byte + MO 4byte + dummy 4byte + /bin/sh의 주소 4byte 더해진 위치에 있으므로, bffffa9c 라고 예상하고 공격을 해 보았다.
/sh 만 인자로 넘겨진 것을 볼 수 있었고, /bin/sh가 모두 넘어가도록 주소를 조금씩 변경하여 찾았다.
그 결과 bffffa98에서 쉘을 띄울 수 있었다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL16 (assassin -> zombie_assassin) : fake ebp (0) | 2013.08.23 |
---|---|
LEVEL15 (giant -> assassin) : no stack, no RTL (0) | 2013.07.19 |
LEVEL14 (bugbear -> giant) : RTL2, only execve (1) | 2013.07.19 |
LEVEL13 (darkknight -> bugbear) : RTL1 (0) | 2013.07.19 |
LEVEL12 (golem -> darkknight) : sfp (0) | 2013.07.19 |
- Total
- Today
- Yesterday