
๋๋ฆผํต https://learn.dreamhack.io/58#1
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
init();
printf("Input: ");
scanf("%s", buf);
return 0;
}
์์ ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ `scanf("%s", buf)์!!
scanf ํจ์์ ํฌ๋งท ์คํธ๋ง ์ค ํ๋์ธ %s๋ ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ์ ๋ ์ฌ์ฉ%s ๋์ %[n]s ์ฌ์ฉํด์ผ ํจstrcpy, strcat, sprintf ๋์ strncpy, strncat, snprintf, fgets, memcpy ๋ฑ์ ์ฌ์ฉํด์ผ ํจํธ๋ฆฌ๊ฑฐ: ์ทจ์ฝ์ ์ ๋ฐํ์์ผ ํ์ธํ๋ ํ์
A๋ฅผ 5๊ฐ ์
๋ ฅํ์ ๋ -> ํ๋ก๊ทธ๋จ ์ ์ ์ข
๋ฃ

A๋ฅผ 64๊ฐ ์
๋ ฅํ์ ๋ -> Segmentation fault ์๋ฌ ์ถ๋ ฅ, ํ๋ก๊ทธ๋จ ๋น์ ์ ์ข
๋ฃ

core dumped๋ ์ฝ์ดํ์ผ์ ์์ฑํ๋ค๋ ๋ป์ผ๋ก, ํ๋ก๊ทธ๋จ ๋น์ ์ ์ข
๋ฃ ์ ๋๋ฒ๊น
์ ์ํด OS๊ฐ ์์ฑ
/var/lib/apport/coredump ๋๋ ํ ๋ฆฌ์ ์ฝ์ด ํ์ผ ์์ฑunlimit -c unlimited ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ฌ ๋ค์ ์คํgdb์๋ ์ฝ์ด ํ์ผ ๋ถ์ ๊ธฐ๋ฅ ์กด์ฌ -> ์ ๋ ฅ์ด ์คํ์ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ๋ถ์ ๋ฐ ์ ธ์ ํ๋ํ๊ธฐ ์ํ ๊ณํ ์ธ์ฐ๊ธฐ
gdb rao -c core ๋ช
๋ น์ด๋ก ์ฝ์ด ํ์ผ ์คํ

mainํจ์์์ ๋ฐํํ๋ ค๊ณ ํ๋๋ฐ, ์คํ ์ต์๋จ์ ์ ์ฅ๋ ๊ฐ์ด ์
๋ ฅ๊ฐ์ ์ผ๋ถ์ธ 0x4141414141414141('AAAAAAAA')๋ผ๋ ๊ฒ์ ์ ์ ์์main ํจ์์ ์ด์
๋ธ๋ฆฌ ์ฝ๋(์ค์ต ์ ๊ฐ์์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ์ด ๋์์ ๊ฐ์์๋ฃ๋ก ๋์ฒด)

(์ค์ต๊ฒฐ๊ณผ: nearpc ๋ช ๋ น์ด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ disassemble main ์คํํ ๋ชจ์ต)
-> ์์ฌ ์ฝ๋๋ก ํํํ๋ฉด
scanf("%s", (rbp-0x30));
rbp-0x30์ ์์น
get_shell() ํจ์๊ฐ ์์main ํจ์์ ๋ฐํ ์ฃผ์๋ฅผ ์ด ํจ์์ ์ฃผ์๋ก ๋ฎ์ด์ ์
ธ ํ๋ํ๊ธฐget_shell()์ ์ฃผ์๋ 0x401199 ์
ํ์ด๋ก๋(Payload): ๊ณต๊ฒฉ์ ์ํด ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ ๋ฐ์ดํฐ

get_shell()์ ์ฃผ์์ธ 0x401199์ \x99\x11\x40\x00\x00\x00\x00\x00๋ก ์ ๋ฌ๋ผ์ผ ๋จ
์ ธ์ ์ป์ด์ผํ๋๋ฐ,,,,์์๋์ง
pwngdb ์ค์น
https://eteo.tistory.com/290