$ 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을 찾는데 꽤 걸린다.
#!/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 결과
[angr_ctf] 03_angr_symbolic_registers (0) | 2022.05.14 |
---|---|
[angr_ctf] 02_angr_find_condition (0) | 2022.05.14 |
[angr_ctf] 00_angr_find (0) | 2022.05.14 |
GoogleCTF 2016 unbreakable_0 (0) | 2022.05.11 |
[DefCamp CTF 2015 Quals] Entry Language (Reverse 100) (0) | 2022.05.11 |