티스토리 뷰

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

}

 

succubusDO에서 GYEGYE에서 GULGUL에서 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에서 쉘을 띄울 수 있었다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday