SYSTEM] Find main function on ubuntu

노션으로 옮김·2020년 3월 20일
0

skills

목록 보기
15/37
post-thumbnail

개요

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 함수를 찾을 수 있는 방법을 고민해야 했다.


문제

#1

디버깅 심볼을 로드할 수 없는 상황

#2

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) 

방법

#1 백트레이싱 이용하기 with 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$ 

0개의 댓글