'리버싱 관련'에 해당하는 글 10건


themida를 언팩해보고 있는데 신기해서 써본다


보면 edi가 가리키는 값을 감소 시키는데 이게 바로 아래있는 주소를 가리키고 있다. 그래서 그냥 브포를 걸고 탈출해버리면 전혀 다른 asm이 나오게 된다.(브포를 걸면 해당주소의 값이 CC로 바뀌기 때문) 

이 주소를 다 지나갈 때까지 f8을 이용해서 하다가 지나가고 나면 브포를 걸고 진행해야한다... 바로 아래 코드가 실시간으로 변하는 걸 보니까 신기했다.


더미다 깔때는 함부로 브포걸지말자 바로 다음주소도 실제 opcode가 아니라 풀어야 하는 곳일지도 모른다... 

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

angr사용법(2)  (0) 2018.05.15
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

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

,

angr사용법(2)

리버싱 관련 2018. 5. 15. 16:16

Claripy를 이용한 인자값 전달 방법


import claripy

claripy.BVS("argv",설정할 크기)

설정할 크기 안에 인자값의 최대 크기를 넣어 주면 됩니다.

ex)argv = claripy.BVS("argv",100*8)


proj.factory.entry_state(args=["./바이너리",argv])

저번에 이야기한 addr변수가 아닌 args변수를 설정해주어야 합니다.


이밑은 저번과 같습니다.


다음글에서는 claripy의 더 자세한 내용을 정리해서 가져오겠습니다


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

themida unpack 할때 신기한점 (1)  (0) 2018.08.10
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

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

,

angr사용법(1)

리버싱 관련 2018. 4. 23. 17:56

angr에서 기본적으로 알아야 할 명령어


binary 선택

proj = angr.Project('binary path', option) #옵션은 생략가능

angr로 분석할 binary 선택


proj.factory.* 생성자들

proj.factory.blank_state()

빈 state 생성

ex) state = proj.factory.blank_state()


proj.factory.entry_state()

entrypoint에서의 state 생성 즉 main에서 부터 시작



proj.factory.full_init_state()

init에서 시작


proj.factory.call_state()

특정 함수에서 시작


위 생성자들은 addr인수로 정확한 위치지정(메모리 주소)이 가능, 

프로그램이 인자값을 받는 경우 entry_state나 full_init_state를 통해 인자값을 제공해야함


proj.factory.simgr, proj.factory.simulation_manager

거의 대부분의 angr리버싱문제에서 등장하는 명령입니다. symbolic execution을 제어하고 state공간탐색을위한 알고리즘을 적용합니다.

ex) simgr = proj.factory.simgr(state)


simgr.explore()

역시나 대부분의 angr문제에서 많이 보이는 명령입니다. 보통 find와 avoid인수를 가지며, find 인수는 말 그대로 우리가 찾을 위치를 의미하며, avoid는 우리가 피해야 할 위치를 의미합니다. find 인수와 avoid인수 모두 메모리 주소 뿐만 아니라 문자열도 가능합니다.


이 정도만 알아 두시면 쉬운 angr 문제들은 모두 푸실 수 있습니다.


기타 문제 예시들은 

https://github.com/angr/angr-doc/tree/master/examples에 많이 있습니다.

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

themida unpack 할때 신기한점 (1)  (0) 2018.08.10
angr사용법(2)  (0) 2018.05.15
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

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

,

EXE를 메모장으로 여는 문제


메모장으로 열면 키로 보이는 문자열이 존재 합니다. 이것이 키 값입니다.

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

codeengn basic 1  (0) 2018.04.01

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

,

메모리 덤프뜨는 문제


프로그램을 실행 한 후 탱고를 선택하면 다른 선택지들과는 다르게 소리가 나오지 않습니다. 소리파일이 깨졋다고 하는 군요.


아이다가 0x402120주소가 함수 프롤로그로 시작함에도 함수로 인식하지 못하니 이곳을 함수로 지정 해 줍시다.


switch-case문으로 이루어져 있는것을 알 수 있군요. 


음악을 재생하는 부분 입니다. 재생할 음악을 나타내는 pszSound가 esi임을 알 수 있으므로 esi주소에 음악파일이 있음을 알 수 있습니다.


여기서 음악파일의 위치를 알 수 있겠군요.


디버깅 하면서 저 주소로 가게되면 wav파일이 있음을 볼 수 있습니다. wav포멧에 맞게 덤프를 뜨시면 됩니다.


그리고 덤프 뜬 음악을 재생하려 하니 에러를 내뿜길래 mp3로 파일로 변환하였습니다.


mp3로 변환한 파일을 들어보면 플래그를 말해줍니다.

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

angr사용법(2)  (0) 2018.05.15
angr사용법(1)  (0) 2018.04.23
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, 아는척하기위한 블로그. 저는 귀엽습니다

,

GetDriveTypeA의 리턴값을 알아야 하는 문제


저희는 CD-Rom으로 인식시키기 위해 GetDriveTypeA의 리턴값을 바꾸어야 합니다.


바꾸지 않고 실행 할 시 이런 화면이 뜹니다.


eax와 esi를 비교해서 같아야지 YEAH구문으로 가는 군요


최종적으로 ESI의 값은 3이 되는 군요 eax와 같아야 하므로 최종 eax값은 3이여야 합니다.


하지만 위에 dec eax가 2번 있으므로 리턴값이 5일 때 이겠군요


flag: 5

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

codeengn basic 2  (0) 2018.04.08

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

,


Video_XXXX.mp4를 제가 분석 해 본 것입니다.

처음 하는 것이라 많이 미숙합니다.

Video_XXX.mp4.pptx


ppt형식입니다.

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

angr사용법(1)  (0) 2018.04.23
codegate2018 final shall we dance? writeup  (4) 2018.04.08
Codegate 2017 angrybird 풀이  (0) 2017.12.14
Codegate 2017 HelloProtector 풀이  (0) 2017.12.13
DEFCON 2016 baby-re 풀이  (0) 2017.12.10

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

,

angr 사용법을 물어보는 아주 기초적인 문제


Codegate 2017 angrybird

z3로도 풀수있지만 angr가 더 편하므로 angr를 사용하겠습니다


보기만 해도 토나오는 그래프 모양이군요... 마지막 것을 봅시다.

printf 뒤쪽으로 목적지를 설정하면 오류가 가끔 발생하므로 print 바로 앞쪽위치를 목적지로 설정하겠습니다.


import angr

START_ADDR = 0x4007c2
FIND_ADDR = 0x404fab

def main():
        proj = angr.Project('angrybird')
        state = proj.factory.entry_state(addr=START_ADDR)
        sm = proj.factory.simulation_manager(state)
        sm.explore(find=FIND_ADDR)
        print(sm)

        found = sm.found[-1]
        print(found)
        flag = found.posix.dumps(0)
        print(flag)

        return flag

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

실행시키면 플래그가 나옵니다.



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

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 HelloProtector 풀이  (0) 2017.12.13
DEFCON 2016 baby-re 풀이  (0) 2017.12.10

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

,

처음보면 어렵지만 알고나면 가장 쉬운 문제 이겠네요


Codegate 2017 HelloProtector


일단 바이너리를 받았으니 파일이 패킹되어 있는지 확인해야 겠지요.

으... 더미다로 패킹되있군요. 2.x버전이라고 하니 언패커가 있을 것입니다.

이럴 때는 툴키디가 되어야 합니다.


여기에 디버거에서 더미다를 언패킹하는 방법이 있으니 참고하시고 간단히 언패킹을 하면!


문자열 검색만 해줘도 나타납니다!


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

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
DEFCON 2016 baby-re 풀이  (0) 2017.12.10

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

,

제가 아주 싫어하는 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, 아는척하기위한 블로그. 저는 귀엽습니다

,