๐ ๋ฌธ์ ์ฝ๋
#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; } } }โ
๋จผ์ ๋ฌธ์ ํ์ผ์ C์ฝ๋๋ฅผ ๋ถ์ํด๋ณด์.
์ ์ฒด์ ์ธ ์ฝ๋๋ ์ฌ์ฉ์๊ฐ ‘box’์ ๊ฐ์ ์ฑ์ฐ๊ณ , ์์์ ์์๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ ์ ์๋ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ์์ธํ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- alarm_handler() ํจ์: SIGALRM ์๊ทธ๋ ํธ๋ค๋ฌ๋ก, ์๊ทธ๋์ด ๋ฐ์ํ๋ฉด "TIME OUT" ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ค.
- initialize() ํจ์: ํ๋ก๊ทธ๋จ ์ด๊ธฐํ๋ฅผ ๋ด๋นํ๊ณ ์๋ค. stdin๊ณผ stdout์ ๋ฒํผ๋ฅผ ๋นํ์ฑํํ๊ณ , SIGALRM ์๊ทธ๋์ alarm_handler() ํจ์๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ, 30์ด ํ์ ์์์ ์ค์ ํ๋ค.
- get_shell() ํจ์: /bin/sh ์ ธ์ ์คํํ๊ณ ์๋ค.
- print_box() ํจ์: ์ฃผ์ด์ง ์์(box)์ ํน์ ์ธ๋ฑ์ค์ ์๋ ์์๋ฅผ ์ถ๋ ฅํ๊ณ ์๋ค.
- menu() ํจ์๋ก ์ฌ์ฉ์์๊ฒ ์์๋ฅผ ์ฑ์ฐ๊ฑฐ๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ฌ ์์๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ ์ ์๋ ๋ฉ๋ด๋ฅผ ํ์ํ๊ณ ์๋ค.
๋ฐ๋ผ์ F'๋ฅผ ์ ๋ ฅํ๋ฉด ์์๋ฅผ ์ฑ์ฐ๊ณ , 'P'๋ฅผ ์ ๋ ฅํ๋ฉด ํน์ ์ธ๋ฑ์ค์ ์๋ ์์๋ฅผ ์ถ๋ ฅํ๋ฉฐ, 'E'๋ฅผ ์ ๋ ฅํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค. 'E'๋ฅผ ์ ํํ๋ฉด ์ด๋ฆ์ ํฌ๊ธฐ๋ฅผ ์ ๋ ฅํ๊ณ ์ด๋ฆ์ ์ฝ์ ํ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
ํด๋น ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก pwndbg ๋ชจ๋๋ก ํด๋น ํ์ผ์์ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๋ฐฉ์ด๊ธฐ๋ฒ์ ํ์ธํด๋ณด์๋ค.
ssp_001์ 000๋ฌธ์ ์ ๋ฌ๋ฆฌ 32๋นํธ ํ๊ฒฝ์์ ์๋ํ๊ณ ์๊ณ , canary๊ฐ ์กด์ฌํ๋ฉฐ NX enabled ์ด๋ฏ๋ก ์คํ ๋ด ์คํ ๊ถํ์ด ์์์ ์ ์ ์์๋ค.
์ฐ์ disassemble main ๋ช ๋ น์ด๋ฅผ ํตํด main ํจ์์ ์คํ ๊ตฌ์กฐ์ ๋ํ ๋ถ์์ ์งํํ์๋ค.
- case F : 0x080487d5 <+170>: lea eax,[ebp-0x88]
- case P : 0x080487f8 <+205>: lea eax,[ebp-0x94]
- case E : 0x08048852 <+295>: mov eax,DWORD PTR [ebp-0x90]
- select : 0x08048797 <+108>: lea eax,[ebp-0x8a]
- dummy ํ์ธ : __stack_chk_fail@plt๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ดค์ ๋, ebp-0x8 ์์น์ ์บ๋๋ฆฌ๊ฐ ์์นํจ์ ์ ์ ์๊ณ , ebp์ ์บ๋๋ฆฌ ์ฌ์ด์ 4byte์ dummy ๊ฐ์ด ์กด์ฌํ๊ณ ์์์ ์ ์ ์๋ค.
์์ ๊ฐ์ด ์ด์ ๋ธ๋ฆฌ์ ๋ํ ๋ถ์์ ๋ฐํ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์คํ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ฆด ์ ์์๋ค.
์ด๋ฅผ ๋ฐํ์ผ๋ก ์๋์ ๊ฐ์ด ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๋ณธ ์ต์คํ๋ก์ ์ฝ๋์์๋ ์นด๋๋ฆฌ ๊ฐ์ ์ป์ด๋ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ๊ฒ์ผ๋ก ๋ณด์์ผ๋ฉฐ SSP๋ฅผ ์ฐํํ๊ณ , ํ๋ก๊ทธ๋จ์ get_shell ํจ์๋ฅผ ํธ์ถํ์ฌ ์ ธ์ ์ป์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
์ดํ ํด๋น ํ์ด์ฌ ์ฝ๋๋ฅผ ์คํํ๊ณ
ls ๋ช ๋ น์ด๋ก ํ์ผ์ ํ์ธํ ํ flag ํ์ผ์ ๋ํ ๋ด์ฉ์ ํ์ธํด๋ณด๊ณ ์ cat ๋ช ๋ น์ด๋ฅผ ํ์ฉํ์๋๋ ์๋์ ๊ฐ์ด ํ๋๊ทธ ๊ฐ์ ํ์ธํ ์ ์์๋ค.
๋ฌธ์ ํด๊ฒฐ-!
'Security > System Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Tool] pwntools (0) | 2024.09.09 |
---|---|
[Tool] gdb (0) | 2024.09.09 |
[Dreamhack] ssp_000 write-up (2) | 2024.09.01 |
[Background] x86 Assembly (0) | 2024.09.01 |
[Background] Linux Memory Layout (0) | 2024.09.01 |