rev-basic-0~3 write up
rev-basic-0 write up
사용한 프로그램 : radare2, ida7.2
main를 어셈으로 보았을 때, 'Correct'라고 적혀있는 구문 바로 위에 'test eax, eax'가 있습니다.
x86 어셈블리어에서 TEST 명령어는 두 피연산자들에 대한 비트 연산인 AND를 수행한다. 그렇다면 eax값을 반환해주는 바로 위 "call section.. text"라는 곳은 분석해 봐야 합니다.
section.. text의 어셈은 다음과 같습니다. 한눈에 봐도 "Compar3_the_str1ng"가 답인 것을 알 수 있습니다.
IDA로 디컴파일 해보겠습니다.
다음과 같고, if문에서 참이 되려면 "sub_140001000"의 반환이 0이 아닌 수가 반환되면 됩니다.
"sub_140001000"을 디컴파일하니 a1(사용자가 입력)과 "Compar3_the_str1ng"을 비교하는 것을 알 수 있습니다.
rev-basic-1 write up
사용한 프로그램 : radare2, ida7.2
어디서 본 어셈 코드 같다. 0 하고 main은 똑같으니 0 하고 동일하게 "section.. text"를 분석해 보겠습니다.
위와 같이, 계속해서 어떠한 숫자와 비교하는 것을 알 수 있습니다. 저 숫자의 크기를 보니 아스키 코드 같습니다.
파이썬이나 손으로 직접해도 괜찮지만 우리는 아이다를 사용해 봅시다.
"section.. text"의 디컴파일입니다. 아이다에서 아스키코드에 마우스를 올리고 "r"를 누르시면 Char형태로 바뀌게 됩니다. 또 "h"를 누르면 int와 hex형태로 바꿀 수도 있습니다. 위와 같은 기능을 통해서 rev-basic-1의 플래그를 알아냈습니다.
"Compar3_the_ch4ract3r"인것을 확인할 수 있습니다.
rev-basic-2 write up
사용한 프로그램 : radare2, ida7.2
main는 똑같네요. 똑같이 section.. text를 분석해봅시다.
음.... 저기 플래그가 보이는 것 같지만 그래도 분석을 하자면,
rsp는 스택 포인터 레지스터입니다. 즉 0x18만큼의 스택이 생성이 됩니다. jmp로 이동을 하는데 다음
0x14000101e 4883f812 cmp rax, 0x12 ; 18
0x140001022 7324 jae 0x140001048
를 보면 0x12(18)번 반복하는 것 같습니다. 반복문이네요.
다음 어셈을 계속 읽으면 4바이트 단위로 띄어가면서 비교하는 것을 알 수 있습니다. 비교하는 배열은
"lea rcx, qword str.Comp4re_the_arr4y" 이곳 인 것 같습니다. 확인해 보면
위와 같이 4바이트 띄여져 있는 플래그를 볼 수 있습니다. 이것 또한 아이다로 확인해보면
저희가 분석한 대로 0x12(18)번 반복하며, 4바이트씩 비교하는 것을 확인할 수 있습니다. aC의 배열을 확인해 보면
플래그가 존재하는 것을 볼 수 있습니다. "Comp4re_the_arr4y"
rev-basic-3 write up
사용한 프로그램 : radare2, ida7.2, python3
또 메인은 똑같으니 건너뛰고 "section.. text"를 분석하겠습니다.
이것 또한 전 문제와 마찬가지로
0x14000101e 4883f818 cmp rax, 0x18 ; 24
0x140001022 732f jae 0x140001053
반복문이 있는 것을 알 수 있고, 반복문의 조건이 i라고 했을 때,
0x14000102f movzx eax, byte [rcx + rax] //eax = [rcx는 비교하는 문자열 + rax는 [rsp] 스택 포인터]
0x140001033 movsxd rcx, dword [rsp] //rcx = [[rsp] 스택 포인터]
0x140001037 mov rdx, qword [arg_8h] //rdx = [사용자 입력]
0x14000103c movzx ecx, byte [rdx + rcx] //ecx = [사용자입력 + rcx : 여기서는 반복문의 i값]
0x140001040 xor ecx, dword [rsp] //ecx ^ rsp : 사용자입력 + i 와 i를 xor 연산 해준다.
0x140001043 mov edx, dword [rsp] //edx = rsp : edx에 i값 넣어주기
0x140001046 lea ecx, dword [rcx + rdx*2] //ecx = rcx + rdx*2 : rcx는 xor연산한 값 + rdx는 i값 * 2
0x140001049 cmp eax, ecx //eax 와 ecx비교 : 플래그와 rcx는 xor연산한 값 + rdx는 i값 * 2를 비교
("str.I_gtcgBf"[i]) == ((*input [i]) ^ i )+ i * 2
이런 식으로 비교하는 것 같습니다. 이렇게 하기 너무 귀찮아요...
rdx, edx 이런 게 헷갈리시면 [해킹] - [해킹] 레지스터봐주세요
아무튼 이렇게 예상했으니 파이썬 코드로 짜도 되지만 아이다로 한번 확인해 보겠습니다.
뭔가 아닌 거처럼 보이지만 우리가 예측한 것과 똑같아요!!! 그렇다면 연산을 파이썬으로 짜 볼까요?
values = [0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66,
0x80, 0x78, 0x69, 0x69, 0x7b, 0x99, 0x6d, 0x88, 0x68,
0x94, 0x9f, 0x8d, 0x4d, 0xa5, 0x9d, 0x45]
for i in range(0, len(values)):
print(chr((values[i] - 2 * i) ^ i), end='')
((*input [i]) ^ i )+ i * 2의 식을 역산해 (input [i] - i * 2) ^ i으로 계산해 주었습니다.
플래그 : "I_am_X0_xo_Xor_eXcit1ng"
'해킹 > 리버싱' 카테고리의 다른 글
[리버싱] 스택프레임이란..? (0) | 2021.11.07 |
---|---|
[리버싱] rev-basic-4~6 write up (0) | 2021.07.14 |
[해킹] 레지스터 (0) | 2021.07.10 |
[해킹] 리버싱 시작 (0) | 2021.07.10 |
[해킹] 해킹의 시작 (0) | 2021.07.10 |