제가 아주 싫어하는 angr문제입니다. 이것만 한 1달은 붙잡고 있었네요

이문제가 angr문제의 대표적 예신데 제 환경에서 일반적인 angr코드로는 풀리지가않더군요. 그래서 다른 코드로 푼것을 올리도록 하겠습니다.

DEFCON 2016 baby-re


import string

import angr
from angr.procedures.stubs.UserHook import UserHook


def main():
	p = angr.Project('baby-re')


	win            = 0x4028e9  #가야되는 위치
	fail           = 0x402941  #피해야될 위치
	main           = 0x4025e7  #메인함수 주소
	PASS_LEN       = 13
	flag_addr      = 0x7fffffffffeff98
	find           = (win,)
	avoid          = (fail,)


	def patch_scanf(state):
		print(state.regs.rsi)
		state.mem[state.regs.rsi:].char = state.solver.BVS('c', 8)

	scanf_offsets = (0x4d, 0x85, 0xbd, 0xf5, 0x12d, 0x165, 0x19d, 0x1d5, 0x20d, 0x245, 0x27d, 0x2b5, 0x2ed)#각 scanf의 offset목록


	init = p.factory.blank_state(addr=main)

	# scanf 패치
	for offst in scanf_offsets:
		p.hook(main + offst, UserHook(user_func=patch_scanf, length=5))


	sm = p.factory.simulation_manager(init)

	ex = sm.explore(find=find, avoid=avoid)

	print(ex)
	s = ex.found[0]
	flag = s.solver.eval(s.memory.load(flag_addr, 50), cast_to=str)

	print("The flag is '{0}'".format(flag))
	return flag

if __name__ in '__main__':
	print(main())

흔히 쓰는 코드보다 엄청나게 길지만 따지고보면 비슷합니다. 게다가 속도도 훨씬 빠른것같아요 


angr사용법을 다음번에 올려야겠네요....


'리버싱 관련' 카테고리의 다른 글

angr사용법(1)  (0) 2018.04.23
codegate2018 final shall we dance? writeup  (4) 2018.04.08
facebook Video_XXXX.mp4 분석  (0) 2017.12.20
Codegate 2017 angrybird 풀이  (0) 2017.12.14
Codegate 2017 HelloProtector 풀이  (0) 2017.12.13

WRITTEN BY
Dukup11ch1
무근본, 실력 0, 아는척하기위한 블로그. 저는 귀엽습니다

,