상세 컨텐츠

본문 제목

[angr_ctf] 01_angr_avoid

SYSTEM HACKING/CTF, etc

by koharin 2022. 5. 14. 15:47

본문

728x90
반응형

파일 정보

$ file 01_angr_avoid 
01_angr_avoid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1be0722542d5f21e30c1f4930e1b036d78d552a8, not stripped

 

실행

이번에도 패스워드 입력받고 틀리면 Try again.을 출력해준다.

 

코드 분석

..을 해보려고 했는데 디스어셈블이 안 돼서 뭔가 이번 문제는 avoid니까 avoid만 보고 angr 적용하는 문제 같다.

		0x080d3773 <+569689>:	lea    eax,[ebp-0x34]
   0x080d3776 <+569692>:	push   eax
   0x080d3777 <+569693>:	call   0x80485cc <maybe_good>
   0x080d377c <+569698>:	add    esp,0x10
   0x080d377f <+569701>:	jmp    0x80d4587 <main+573293>
   0x080d3784 <+569706>:	call   0x80485bf <avoid_me>
   0x080d3789 <+569711>:	lea    eax,[ebp-0x34]
   0x080d378c <+569714>:	movzx  eax,BYTE PTR [eax]
   0x080d378f <+569717>:	movzx  eax,al
   0x080d3792 <+569720>:	and    eax,0x1
   0x080d3795 <+569723>:	test   eax,eax
   0x080d3797 <+569725>:	setne  dl
   0x080d379a <+569728>:	lea    eax,[ebp-0x20]
   0x080d379d <+569731>:	movzx  eax,BYTE PTR [eax]
   0x080d37a0 <+569734>:	movzx  eax,al
   0x080d37a3 <+569737>:	and    eax,0x1
   0x080d37a6 <+569740>:	test   eax,eax
   0x080d37a8 <+569742>:	setne  al
   0x080d37ab <+569745>:	xor    eax,edx
   0x080d37ad <+569747>:	test   al,al
   0x080d37af <+569749>:	je     0x80d37ce <main+569780>
   0x080d37b1 <+569751>:	call   0x80485bf <avoid_me>
   0x080d37b6 <+569756>:	sub    esp,0x8
   0x080d37b9 <+569759>:	lea    eax,[ebp-0x20]
   0x080d37bc <+569762>:	push   eax
   0x080d37bd <+569763>:	lea    eax,[ebp-0x34]
   0x080d37c0 <+569766>:	push   eax
   0x080d37c1 <+569767>:	call   0x80485cc <maybe_good>
   0x080d37c6 <+569772>:	add    esp,0x10
   0x080d37c9 <+569775>:	jmp    0x80d4587 <main+573293>
   0x080d37ce <+569780>:	sub    esp,0x8
   0x080d37d1 <+569783>:	lea    eax,[ebp-0x20]
   0x080d37d4 <+569786>:	push   eax
   0x080d37d5 <+569787>:	lea    eax,[ebp-0x34]
   0x080d37d8 <+569790>:	push   eax
   0x080d37d9 <+569791>:	call   0x80485cc <maybe_good>
   0x080d37de <+569796>:	add    esp,0x10
   0x080d37e1 <+569799>:	jmp    0x80d4587 <main+573293>
   0x080d37e6 <+569804>:	call   0x80485bf <avoid_me>

디스어셈블러로 분석 안 되는 이유가 있다.

disass main 해서 보려는데 너무 길다....

코드 전체적으로 <avoid_me>, <maybe_good> 호출이 반복적으로 이루어지는데, 피하는 주소는 0x80485bf 만 있는 것 같다.

역시 <maybe_good>와 <avoid_me>로 찾은 solution으로는 안 된다.


pwndbg> disass 0x80485cc
Dump of assembler code for function maybe_good:
   0x080485cc <+0>:	push   ebp
   0x080485cd <+1>:	mov    ebp,esp
   0x080485cf <+3>:	sub    esp,0x8
   0x080485d2 <+6>:	movzx  eax,BYTE PTR ds:0x80d603d
   0x080485d9 <+13>:	test   al,al
   0x080485db <+15>:	je     0x8048606 <maybe_good+58>
   0x080485dd <+17>:	sub    esp,0x4
   0x080485e0 <+20>:	push   0x8
   0x080485e2 <+22>:	push   DWORD PTR [ebp+0xc]
   0x080485e5 <+25>:	push   DWORD PTR [ebp+0x8]
   0x080485e8 <+28>:	call   0x8048410 <strncmp@plt>
   0x080485ed <+33>:	add    esp,0x10
   0x080485f0 <+36>:	test   eax,eax
   0x080485f2 <+38>:	jne    0x8048606 <maybe_good+58>
   0x080485f4 <+40>:	sub    esp,0xc
   0x080485f7 <+43>:	push   0x80d463e
   0x080485fc <+48>:	call   0x80483d0 <puts@plt>
   0x08048601 <+53>:	add    esp,0x10
   0x08048604 <+56>:	jmp    0x8048617 <maybe_good+75>
   0x08048606 <+58>:	sub    esp,0xc
   0x08048609 <+61>:	push   0x80d4633
   0x0804860e <+66>:	call   0x80483d0 <puts@plt>
   0x08048613 <+71>:	add    esp,0x10
   0x08048616 <+74>:	nop
   0x08048617 <+75>:	nop
   0x08048618 <+76>:	leave  
   0x08048619 <+77>:	ret
pwndbg> x/s 0x80d463e
0x80d463e:	"Good Job."
pwndbg> x/s 0x80d4633
0x80d4633:	"Try again."

maybe_good 함수를 자세히 보면, strcmp로 비교 후 Good Job.이나 Try again. 을 출력해준다.

따라서 strcmp 결과가 0이면 그대로 다음 코드를 진행해서 잘했다고 출력해주므로, 실질적으로는 0x080485f4 주소를 찾는게 좋고, 0x8048617 주소를 피해야 하는 경로이다. (그래서 maybe_good 인가보다.)

0x080485f4 주소, 0x8048617 주소가 안 되는 줄 알았는데 solution을 찾는데 꽤 걸린다.

 

Exploit

#!/usr/bin/python                                                                               
import angr

'''
AVOID=0x08048609
FIND=0x080485f7 
'''
FIND=0x080485f4
AVOID=0x8048606

# create angr project
project = angr.Project('./01_angr_avoid', auto_load_libs=False)

# set starting state to main()
initial_state = project.factory.entry_state(add_options={angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY, angr.options.SYMBOL_FILL_UNCONSTRAINED_REGISTERS})

# create simulation manager initializing starting state
simgr = project.factory.simgr(initial_state)

# explore possible path while avoiding given address 
simgr.explore(find=FIND, avoid=AVOID)

if simgr.found:
    print(simgr.found[0].posix.dumps(0))
else:
    raise Exception('could not find the solution')

FIND=0x080485f7, AVOID=0x08048609 결과

FIND=0x080485f4, AVOID=0x8048606 결과

728x90
반응형

관련글 더보기