목록Reversing (8)
D1N0's hacking blog
1. pushad, popad x96dbg로 패킹된 파일을 열어 사용자 코드로 실행을 하면 pushad 명령을 찾을 수 있다 프로그램 실행을 위한 언패킹 전에 레지스터 상태를 스택에 저장하고, 언패킹이 끝날때 popad 명령으로 레지스터를 복구한다 pushad를 실행하고 esp를 덤프해서 따라가면 레지스터들이 보인다 저 주소에 하드웨어 중단점을 걸어준다 그리고 F9로 실행하면 언패킹이 끝난 주소에서 멈춘다 위에서 popad 명령이 실행된 것을 확인할 수 있다 jmp 08.1012475가 보이는데, 이 01012475가 이 프로그램의 OEP이다 2. Exeinfo PE 일단 upx로 파일을 언패킹해준다 그리고 Exeinfo로 보면 EP를 바로 알 수 있다 PE버튼을 눌러 헤더 정보를 보면 Image bas..
지난번 글을 보지 않았다면 먼저 보고 오자 03_angr_symbolic_registers 지난번 글을 보지 않았다면 먼저 보고 오자 02_angr_find_condition 지난번 글을 보지 않았다면 먼저 보고 오자 01_angr_avoid 지난 글을 보지 않았다면 먼저 보고 오자 00_angr_find 들어가기 전에 이 글은 angr d1n0.tistory.com 시작 이번에는 스택에 symbolic value를 넣어 스택의 값을 구하는 방법을 알아보겠다 이번 내용은 함수의 호출과정에서의 스택의 변화를 알 필요가 있기 때문에 예제의 환경인 x86환경에서의 함수 호출과정을 알고 난 뒤에 보는게 좋다 C언어 함수 호출과정 - x86 포너블에서 너무 중요하고 기초적인 내용이지만 아직도 헷갈려서 정리한다 이..
지난번 글을 보지 않았다면 먼저 보고 오자 02_angr_find_condition 지난번 글을 보지 않았다면 먼저 보고 오자 01_angr_avoid 지난 글을 보지 않았다면 먼저 보고 오자 00_angr_find 들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리 d1n0.tistory.com 시작 이제부턴 angr를 더 폭넓게 사용하는 방법을 살펴보겠다 전까지는 단순히 입력과 출력만 가지고 문제를 풀었다면 이번에는 레지스터의 값을 사용해 볼 것이다 예제를 먼저 보도록 하자 undefined4 main(void) { int iVar1; int iVar2; int iVar3; undefined4 unaff_EBX; undefined8 uVar4; printf("..
지난번 글을 보지 않았다면 먼저 보고 오자 01_angr_avoid 지난 글을 보지 않았다면 먼저 보고 오자 00_angr_find 들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리버싱 지식을 기본 전제로 하고 있다 모든 문제는 github.c d1n0.tistory.com 시작 이번에는 예고한 대로 find와 avoid 인자에 주소를 직접 넣는 대신 특정 조건을 넣는 방법을 알아보겠다 이에 대해 설명하기 전에 예제를 먼저 분석해보겠다 undefined4 main(undefined4 param_1,undefined4 param_2) { char cVar1; int iVar2; int in_GS_OFFSET; int local_48; int local_44; ch..
지난 글을 보지 않았다면 먼저 보고 오자 00_angr_find 들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리버싱 지식을 기본 전제로 하고 있다 모든 문제는 github.com/jakespringer/angr_ctf를 바탕으로 하였고, 바이너리 파 d1n0.tistory.com 시작 이번에 알아볼 것은 프로그램 실행 중에 피할 주소를 설정하는 방법이다 일단 angr_ctf의 01번 문제를 보며 알아보자 파일을 보면 00번과 비교해볼 때 유독 크기가 큰 것을 알 수 있다 아니나 다를까 기드라가 디컴파일을 실패했다 그러므로 우리는 간단한 흐름만 살펴보겠다 함수를 보면 눈에 띄는 게 있다 maybe_good은 실행해야 하는 함수, avoid_me는 실행하면 안 되..
들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리버싱 지식을 기본 전제로 하고 있다 모든 문제는 github.com/jakespringer/angr_ctf를 바탕으로 하였고, 바이너리 파일은 github.com/Hustcw/Angr_Tutorial_For_CTF/tree/master/problems를 사용했다 또, 이를 활용한 블로그인 blog.notso.pro/2019-03-20-angr-introduction-part0를 바탕으로 공부하여 정리한 글임을 밝힌다 Angr란 우리가 일반적으로 리버싱 문제를 풀 때에는 암호화 함수를 역연산하여 원래의 비밀번호 등을 구한다 그러나 그 암호화 함수가 너무 길고 복잡하다면? 혹은 단순히 역연산 하기가 너무 귀찮다면? 이..
z3 solver를 써볼 문제를 찾다가 이걸 선택하게 되었다 굳이 z3 solver를 안 써도 풀 수 있을 것 같기는 한데 그래도 이왕 배운 거 써먹어보고 싶었다 문제 풀이 분석 일단 주어진 파일의 hex값을 보면 elf파일임을 알 수 있다 실행을 해보면 입력을 받는다 그리고 바로 끝나는데 키가 맞으면 뭔가 일어날 것 같다 IDA로 까보면 입력을 받고 check_key를 실행하여 1이면 flag 파일을 열어 출력해주는 것을 알 수 있다 check_key 함수는 입력받은 문자열을 encoding 함수에 넣고 OO]oUU2U
Z3 solver z3 solver는 특정 값들을 찾아주는 SMT solver 모듈이라고 한다 쉽게 말하면 여러 수식을 풀어주는 모듈이라고 생각하면 된다 리버싱 할 때도 많이 필요하고 그게 아니더라도 유용히 쓸 수 있을 거 같아서 정리하기로 했다 설치 일단 Z3 solver 모듈의 링크는 이곳이다 github.com/Z3Prover/z3 들어가면 다양한 언어에서의 설치 과정이 자세히 나와있지만 나는 파이썬을 쓸 거라서 pip로 간단히 설치가 가능하다 pip install z3-solver or pip3 install z3-solver 기본 문법 사용 전 모듈 불러오기 from z3 import * 정수형 미지수 선언 x = Int('x') y = Int('y') 실수형 미지수 선언 x = Real('x'..