728x90
반응형
system, format string bug 3이 막혀 푸는 문제 2탄.
문제 파일을 다운받아보면 .bin 파일이고, 제목에서 보듯 elf x86 파일이다.
보통 크래킹 문제는 flag가 파일 내에 포함되어있는 경우가 많고, 그게 아니라면 flag를 암호화 & 복호화 하는 경우가 대부분인 것 같다.
1번 문제니 그냥 string을 뽑아봤고, 혹시나했던게 역시나 였다.
┌──(kali㉿kali)-[~/Downloads]
└─$ strings ch1.bin
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
puts
realloc
getchar
__errno_location
malloc
stderr
fprintf
strcmp
strerror
__libc_start_main
GLIBC_2.0
PTRh@
[^_]
%s : "%s"
Allocating memory
Reallocating memory
----------#플래그는 삭제
############################################################
## Bienvennue dans ce challenge de cracking ##
############################################################
Veuillez entrer le mot de passe :
Bien joue, vous pouvez valider l'epreuve avec le pass : %s!
Dommage, essaye encore une fois.
GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.0.2)
GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.0.2)
GCC: (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
GCC: (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.0.2)
GCC: (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.0.2)
.symtab
.strtab
.shstrtab
.interp
.note.ABI-tag
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rel.dyn
.rel.plt
.init
.text
.fini
.rodata
.eh_frame
.ctors
.dtors
.jcr
.dynamic
.got
.got.plt
.data
.bss
.comment
ch1.c
_GLOBAL_OFFSET_TABLE_
__init_array_end
__init_array_start
_DYNAMIC
data_start
__errno_location@@GLIBC_2.0
strerror@@GLIBC_2.0
__libc_csu_fini
_start
getchar@@GLIBC_2.0
__gmon_start__
_Jv_RegisterClasses
_fp_hw
realloc@@GLIBC_2.0
_fini
__libc_start_main@@GLIBC_2.0
_IO_stdin_used
__data_start
getString
stderr@@GLIBC_2.0
__dso_handle
__DTOR_END__
__libc_csu_init
printf@@GLIBC_2.0
fprintf@@GLIBC_2.0
__bss_start
malloc@@GLIBC_2.0
_end
puts@@GLIBC_2.0
_edata
strcmp@@GLIBC_2.0
__i686.get_pc_thunk.bx
main
_init
printError
gdb로 디스어셈블 해봐도, 문자를 입력 받고 특정 문자열과 비교하게되며, 이 위치의 값을 읽어오면 된다.
즉,
0x080486eb <+78>: call 0x80485fe <getString>
0x080486f0 <+83>: mov %eax,-0xc(%ebp)
0x080486f3 <+86>: mov -0x8(%ebp),%eax
0x080486f6 <+89>: mov %eax,0x4(%esp)
0x080486fa <+93>: mov -0xc(%ebp),%eax
0x080486fd <+96>: mov %eax,(%esp)
0x08048700 <+99>: call 0x80484d8 <strcmp@plt>
getString으로 값을 받아들이고 이를 %ebp-12에 저장하고,
%ebp-8 값을 가져와서 eax에 저장하고, %esp+4에 넣은 다음
%ebp+12 값을 %eax에 저장하고, 이를 %esp 주소의 값으로 저장한다.
strcmp의 경우 stack에 가장 위의 값과 +4 위치의 값을 비교하는데
현재 가장 위의 값은
%esp = 받아들인 값,
%esp + 4 = %ebp - 8
이기에 %ebp - 8이 비교 대상임을 알 수 있다.
어셈블러 코드를 다시 보면 프로그램 초기에 %ebp - 8에 특정 값을 넣는데 아래와 같다.
gef➤ disas main
Dump of assembler code for function main:
=> 0x0804869d <+0>: lea 0x4(%esp),%ecx
0x080486a1 <+4>: and $0xfffffff0,%esp
0x080486a4 <+7>: push -0x4(%ecx)
0x080486a7 <+10>: push %ebp
0x080486a8 <+11>: mov %esp,%ebp
0x080486aa <+13>: push %ecx
0x080486ab <+14>: sub $0x24,%esp
0x080486ae <+17>: movl $0x8048841,-0x8(%ebp)
0x080486b5 <+24>: movl $0x804884c,(%esp)
0x080486bc <+31>: call 0x80484c8 <puts@plt>
0x080486c1 <+36>: movl $0x804888c,(%esp)
0x080486c8 <+43>: call 0x80484c8 <puts@plt>
0x080486cd <+48>: movl $0x80488cc,(%esp)
0x080486d4 <+55>: call 0x80484c8 <puts@plt>
0x080486d9 <+60>: movl $0x804890c,(%esp)
0x080486e0 <+67>: call 0x8048498 <printf@plt>
0x080486e5 <+72>: mov -0xc(%ebp),%eax
0x080486e8 <+75>: mov %eax,(%esp)
0x080486eb <+78>: call 0x80485fe <getString>
0x080486f0 <+83>: mov %eax,-0xc(%ebp)
0x080486f3 <+86>: mov -0x8(%ebp),%eax
0x080486f6 <+89>: mov %eax,0x4(%esp)
0x080486fa <+93>: mov -0xc(%ebp),%eax
0x080486fd <+96>: mov %eax,(%esp)
0x08048700 <+99>: call 0x80484d8 <strcmp@plt>
0x08048705 <+104>: test %eax,%eax
0x08048707 <+106>: jne 0x804871e <main+129>
0x08048709 <+108>: mov -0x8(%ebp),%eax
0x0804870c <+111>: mov %eax,0x4(%esp)
0x08048710 <+115>: movl $0x8048930,(%esp)
0x08048717 <+122>: call 0x8048498 <printf@plt>
0x0804871c <+127>: jmp 0x804872a <main+141>
0x0804871e <+129>: movl $0x8048970,(%esp)
0x08048725 <+136>: call 0x80484c8 <puts@plt>
0x0804872a <+141>: mov $0x0,%eax
0x0804872f <+146>: add $0x24,%esp
0x08048732 <+149>: pop %ecx
0x08048733 <+150>: pop %ebp
0x08048734 <+151>: lea -0x4(%ecx),%esp
0x08048737 <+154>: ret
End of assembler dump.
gef➤ x/s 0x8048841
0x8048841: "----------#플래그는 삭제"
728x90
반응형
'Wargame > Root me' 카테고리의 다른 글
[Cryptanalysis] Encoding - UU (0) | 2022.07.15 |
---|---|
[Cryptanalysis] Encoding - ASCII (0) | 2022.07.15 |
[App-Script] Bash - System 1 (0) | 2022.07.15 |
[App-System] ELF x86 - Format String Bug Basic 3 (0) | 2022.07.13 |
[App-System] ELF x86 - Stack buffer overflow basic 6 (0) | 2022.07.12 |