riftctf의 리버싱 바이너리를 gdb로 실행했는데
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from chall2.elf...(no debugging symbols found)...done.
(gdb) disas main
No symbol table is loaded. Use the "file" command.
(gdb)
main 함수를 디스어셈블링 할 수 없었다.
문제파일의 디버깅을 위해선 코드섹션을 찾아야 하는데 심볼이 없으므로
다른 main 함수를 찾을 수 있는 방법을 고민해야 했다.
디버깅 심볼을 로드할 수 없는 상황
elf 헤더를 확인해봐도 가상주소로 보이는 주소값만 나와있다.
당연히 gdb상에서 해당 주소로 코드를 확인할 수 없다.
root@j-VirtualBox:/work/ctf/riftctf# readelf -h chall2.elf ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x1080 Start of program headers: 64 (bytes into file)
EP를 디버거에서 확인해보면 표시되지 않는다.
(gdb) disas *0x1080 No function contains specified address. (gdb)
문득 떠오른 방법이다.
그냥 무작정 프로그램을 실행한 뒤
Ctrl+C
를 눌러 인터럽트를 발생시킨다.
그리고 bt
를 입력하여 스택을 확인한다.
gdb-peda$ bt
#0 0x00007ffff7af4081 in __GI___libc_read (fd=0x0, buf=0x555555559670, nbytes=0x400) at ../sysdeps/unix/sysv/linux/read.c:27 #1 0x00007ffff7a71148 in _IO_new_file_underflow (fp=0x7ffff7dcfa00 <_IO_2_1_stdin_>) at fileops.c:531 ... omit ... #7 0x00007ffff7a05b97 in __libc_start_main (main=0x5555555551ea, argc=0x1, argv=0x7fffffffe028, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe018) at ../csu/libc-start.c:310 #8 0x00005555555550aa in ?? ()
중간에 __libc_start_main
가 호출되는 것을 확인할 수 있다.
인자 값에서 main
함수의 주소를 확인할 수 있다.
gdb-peda$ b *0x5555555551ea Breakpoint 3 at 0x5555555551ea gdb-peda$ r Starting program: /work/ctf/riftctf/chall2.elf [----------------------------------registers-----------------------------------] RAX: 0x5555555551ea (push rbp) RBX: 0x0 RCX: 0x555555555290 (push r15) RDX: 0x7fffffffe038 --> 0x7fffffffe395 ("CLUTTER_IM_MODULE=xim") RSI: 0x7fffffffe028 --> 0x7fffffffe378 ("/work/ctf/riftctf/chall2.elf") RDI: 0x1 RBP: 0x555555555290 (push r15) RSP: 0x7fffffffdf48 --> 0x7ffff7a05b97 (<__libc_start_main+231>: mov edi,eax) RIP: 0x5555555551ea (push rbp) R8 : 0x7ffff7dd0d80 --> 0x0 R9 : 0x7ffff7dd0d80 --> 0x0 R10: 0x0 R11: 0x0 R12: 0x555555555080 (xor ebp,ebp) R13: 0x7fffffffe020 --> 0x1 R14: 0x0 R15: 0x0 EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow) [-------------------------------------code-------------------------------------] 0x5555555551e5: mov eax,DWORD PTR [rbp-0x8] 0x5555555551e8: pop rbp 0x5555555551e9: ret => 0x5555555551ea: push rbp 0x5555555551eb: mov rbp,rsp 0x5555555551ee: sub rsp,0x50 0x5555555551f2: mov rax,QWORD PTR fs:0x28 0x5555555551fb: mov QWORD PTR [rbp-0x8],rax [------------------------------------stack-------------------------------------] 0000| 0x7fffffffdf48 --> 0x7ffff7a05b97 (<__libc_start_main+231>: mov edi,eax) 0008| 0x7fffffffdf50 --> 0x1 0016| 0x7fffffffdf58 --> 0x7fffffffe028 --> 0x7fffffffe378 ("/work/ctf/riftctf/chall2.elf") 0024| 0x7fffffffdf60 --> 0x100008000 0032| 0x7fffffffdf68 --> 0x5555555551ea (push rbp) 0040| 0x7fffffffdf70 --> 0x0 0048| 0x7fffffffdf78 --> 0xcc784ec4726c2742 0056| 0x7fffffffdf80 --> 0x555555555080 (xor ebp,ebp) [------------------------------------------------------------------------------] Legend: code, data, rodata, value Breakpoint 3, 0x00005555555551ea in ?? () gdb-peda$