🥋Form - ImaginaryCTF 2023

Source

Analysis

vuln.c
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  char *format; // [rsp+0h] [rbp-20h] BYREF
  char *s; // [rsp+8h] [rbp-18h]
  FILE *stream; // [rsp+10h] [rbp-10h]
  unsigned __int64 v6; // [rsp+18h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  s = (char *)malloc(0x20uLL);
  format = (char *)malloc(0x20uLL);
  setbuf(stdin, 0LL);
  setbuf(_bss_start, 0LL);
  stream = fopen("flag.txt", "r");
  fgets(s, 32, stream);
  fgets(format, 32, stdin);
  s = (char *)&format;
  if ( strlen((const char *)&format) <= 0x17 )
    printf(format);
  _exit(0);
}

Nhìn qua thì flag của bài này được lưu ở biến s thuộc vùng nhớ heap. Và chuỗi format không được lớn hơn 0x17(23) kí tự.

Ý tưởng

Tôi sẽ ghi đè địa chỉ trên stack thành địa chỉ heap chứa flag đó :>>. Vì chúng ở khá gần nhau.

0xd0 ---> 0xa0

Same that:

Và sau đó ghi đè địa chỉ leak ra chuỗi string đó bằng %6$s là xong.

Exploit:

padding "%c" * 5 + "%155c" + "%hhn" ==> Offset 7 and use %6$s ==> Done

Last updated