Tomas_Antecky
윈도우즈에서 실습하기 때문에 Reversing_kr의 Easy_Crackme.exe로 실습해보았다.
>ij~{} :informations, output of command in json format, json indent
더 자세한 표현식은 아래 명령어를 통해 참고
>?@? : 출력 표현식 리스트
b : 블락 크기 출력, 기본 100블럭임
b [크기] : 블락크기 설정, 32비트에서는 참고로 4블락당 1개의 명령어가 출력됨
[0x00401188]> b 12
[0x00401188]> pd
;-- entry0:
;-- eip:
0x00401188 55 push ebp
0x00401189 8bec mov ebp, esp
0x0040118b 6aff push 0xffffffffffffffff
ie: 엔트리 포인트 출력됨
S=: shows program’s segments in a fancy way,
data영역이 읽고 쓰기가 가능하고 text영역은 읽고 실행하기가 가능하다는걸 알 수 있다.
[0x00401188]> S=
00* 0x00401000 |#########################--------------------------------| 0x00405000 16K mr-x .text
01 0x00405000 |------------------------###########----------------------| 0x00406000 4K mr-- .rdata
02 0x00406000 |----------------------------------##############---------| 0x00409000 12K mrw- .data
03 0x00409000 |-----------------------------------------------##########| 0x0040a000 4K mr-- .rsrc
=> 0x00401188 |---------------------------------------------------------| 0x00401187
It’s always a good idea to search for interesting strings
izz: searches for string in the whole binary
We can combine the command with an internal less as well (i.e. izz~..) : 여기서 말하는 less는 리눅스의 less와 동일한 기능임
전체 strings를 보는건 너무 많고 비효율적이다.
.data 섹션만 확인해보자. 다음과 같이 검색하면 된다.
>izz~.data : 물결(~) 명령은 리눅스의 grep과 동일하다.
274 0x000057e2 0x004057e2 12 13 (.rdata) ascii LCMapStringW
275 0x000057f2 0x004057f2 14 15 (.rdata) ascii GetStringTypeA
276 0x00005804 0x00405804 14 15 (.rdata) ascii GetStringTypeW
277 0x00005814 0x00405814 12 13 (.rdata) ascii KERNEL32.dll
278 0x00006030 0x00406030 18 19 (.data) ascii Incorrect Password
279 0x00006044 0x00406044 17 18 (.data) ascii Congratulation !!
280 0x00006058 0x00406058 11 12 (.data) ascii EasyCrackMe
281 0x0000606a 0x0040606a 11 12 (.data) ascii AGR3versing
V: 비쥬얼모드.
비쥬얼모드 내부에서 r2명령을 실행하려면 ':' 키를 입력하면 된다.
'c'를 입력하면 커서모드로 전환된다.
비쥬얼모드에서 함수 돌아다니다가 다시 entry0로 돌아가려면 다음과 같이 입력하면 된다.
:s entry0
V를 한번더 입력하면 함수 그래프 모드로 전환된다.
이 기능을 사용하려면 Analyze가 선행되어야 한다.
다음과 같이 입력하여 함수를 분석하자 af: Analyze function의 약자.
aa는 모든걸 분석하므로 바이너리 크기가 크면 권장되지 않는다.
그래프 모드에서 유용한 명령어들
p/P rotates between views
y/Y folds current node
t/f follows conditional jump
g? jumps to particular node (e.g. gc)
. centers current node
x: 주소에 존재하는 메모리 검사
@: 임시적인 주소 사용/설정
[0x00401188]>x @ 0x4000e8
0x4012c7에서 16진수(x) 32개 출력
[0x00401188]>x 32 @ 0x4012c7
psz: 마지막이 \0로 끝나는 문자열 출력
Zero terminated strings can be printed by running psz
[0x00401188]>psz @ 0x401244
PuVVP@
원본 바이너리 파일 백업
!: radare가 아닌 터미널 명령어 사용인 듯..
리눅스: !cp 파일명 파일명.bak
윈도우: !copy 파일명 파일명.bak
[0x00401188]>!copy Easy_CrackMe.exe Easy_CrackMe.exe.bak
바이너리 수정하기
바이너리를 수정하려면 쓰기 모드로 열어야 가능하다.
oo+: Enabling writing
(*근데 왜 writing 모드로 안될까..? 버그인지..아닌지 모르겠다...종료 후 radare2 -w [파일명]을 통해 쓰기모드로 오픈하면 된다.)
radare2 -w [파일명]
쓰기모드로 열렸는지 확인
[0x004011ea]> i~mode
mode -rwx
비쥬얼 커서모드에서 변경하기를 원하는 명령어로 이동후
A: 어셈블러 상호작용 기능, 원하는 명령어 만들어를 만들어서 덮어 쓸 수 있다.
변경된 것 비교
[0x00401188]>!radiff2 Easy_CrackMe.exe Easy_CrackMe.exe.bak
디버깅을 통해 분석 (내가 실습중인 바이너리와 다르므로 제외)
Now it is time to switch to dynamic analysis:
○ Reopen the binary (oo)
○ Start the binary with an attached debugger (ood)
○ Place a breakpoint at 0x0060016a (db 0x0060016a)
○ Continue (dc/F9) until the breakpoint is hit
○ Provide some garbage input as a password
○ After that the breakpoint is hit
○ Write “L” character (0x4c byte) to the stack
(wx 0x4c @ rcx)
○ Confirm it by running px 1 @ rcx
○ Perform several single step (ds/F7) to see valid instructions emerging
○ A command can be repeated several times by providing number prefix (e.g. 300ds)
-마지막 r2pipe를 통해 파이썬으로 문제 풀기 [진행예정]-
'Debugger > radare2' 카테고리의 다른 글
Radare2 디버깅 커맨드 (0) | 2020.01.07 |
---|---|
Radare2 강의와 치트시트 (0) | 2020.01.03 |
THC2018 (0) | 2020.01.02 |
A journey into Radare 2 – Part 2: Exploitation (미완료) (0) | 2020.01.02 |
How to make radare2 work for a large binary? (0) | 2020.01.02 |