Description

Category: Pwnable

Source: HackCON CTF 2019

Points: 469

Author: Jisoon Park(js00n.park)

Description:

I have stack canaries enabled, Can you still B0f me ? Service : nc 68.183.158.95 8991

Download: q3 libc.so.6

Write-up

주어진 파일을 IDA로 디컴파일 해보자.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  FILE *stream; // ST08_8
  char s[8]; // [rsp+10h] [rbp-20h]
  __int64 v6; // [rsp+18h] [rbp-18h]
  unsigned __int64 v7; // [rsp+28h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  *(_QWORD *)s = 0LL;
  v6 = 0LL;
  stream = (FILE *)_bss_start;
  printf("Enter name : ", argv, envp);
  fgets(s, 16, stream);
  puts("Hello");
  printf(s, 16LL);
  printf("Enter sentence : ");
  fgets(s, 256, stream);
  return 0;
}

fgets()를 이용해서 두 번의 입력을 줄 수 있는데, 첫 번째 fgets()를 사용하면 fsb 공격이 가능하고, 두 번째 fgets()에서는 bof 공격이 가능하다.

libc를 줬으니 ROP 또는 Oneshot-gadget을 이용하면 될 것 같은데, 이를 위해서는 libc_base 주소를 알아내야 한다.

추가로, cananry가 적용되어 있으니 canary의 값도 겸사겸사 알아내 보자.

첫 번째 입력으로 %11lx:lx 을 던져주면 canary와 main 함수의 return address를 알아낼 수 있다.

main 함수는 libc.so의 __libc_start_main에 있는 main 함수 호출 주소 다음으로 복귀하도록 되어 있으니 이를 이용하여 libc_base의 주소를 계산해낼 수 있다.

주어진 libc.so를 분석해보면 main 함수가 0x20830 offset으로 리턴될 것을 알 수 있고, oneshot gadget은 0x45216 offset에 있는 것도 알아낼 수 있다.

oneshot gadget을 이용하기 위한 재료들이 다 갖추어 졌으니 실제 libc 주소를 알아내서 bof 공격을 시도하면 shell을 얻을 수 있다. (코드)

Flag : d4rk{H3ll0_R0p}c0de

'writeups > Pwnable' 카테고리의 다른 글

nothing more to say  (0) 2019.11.26
2 small 2 Pwn  (0) 2019.11.26
speedrun-002  (0) 2019.11.26
horcruxes  (0) 2019.11.26
shellql  (0) 2019.11.26

+ Recent posts