rev-basic-2
Correct와 Wrong을 판별해주는 함수가 있다.
그거 클릭하고 확인해보면
벌써 어셈부터 수상하다.
aC 옆에 "C"가 있다.
cmp 부분을 보면 4 * rax 만큼 더해서 비교한다.
비교하는 aC 눌러보면
4 bytes씩 align 되어있으니 아까 cmp에서 비교하는 거 생각해보면
이게 flag라는 것을 알 수 있다.
rev-basic-3
함수 리턴값으로 correct와 wrong이 갈린다.
저 함수 들어가보면
var_18이 count 변수인 거 같고, byte_140003000에 var_18 더해서 1바이트를 eax에 넣고
var_18 + arg_0 1바이트랑 var_18 xor 해서 ecx에 넣고 rcx+var_18*2랑 eax랑 비교한다.
디컴파일한 거 보면 아까 거랑 다른 거 없다.
byte_140003000 더블클릭해서 보면 hex값이 많은 것을 볼 수 있다.
커서 byte_140003000 갖다 대고
ida_bytes.get_bytes(here(),32)하면 32개 리스트로 뽑을 수 있다.
아까 cmp 할 때 var_18+arg_0 1바이트랑 var_18 xor 하고 var_18 * 2 더해서 비교했다.
이 계산을 거꾸로 하면 된다.
var_18 * 2를 빼고 다시 var_18이랑 xor 하면 원래 인풋을 구할 수 있다.
rev-basic-4
구조는 앞이랑 비슷하다.
sub_140001000 눌러서 들어가 보면
var_18은 카운트 변수이다.
var_18 + arg_0을 >> 4 하고 var_18 + arg_0을 << 4 하고 0xf0이랑 and 한 거 or 해서 byte_140003000이랑 비교한다.
디컴파일하면 이거다.
똑같은 코드 짜서 char 범위로 돌리다 보면 답을 구할 수 있다.
rev-basic-5
구조는 앞에서 나온 거랑 별 다를 게 없다.
sub_140001000 들어가 보면
복잡해 보이니 그냥 디컴파일로 보자
a1[i] + a[i+1]이랑 byte_140003000[i]를 0x18번 비교한다.
0x17번째가 0이니까 a[0x17] + a[0x18]은 0이다.
사용자가 입력한 건 무조건 아스키 범위 안에 있어야 하니까, 둘 다 0인 것을 알 수 있다.
0x17번째에 NULL 넣어주고 for 돌리면 구할 수 있다.
'Layer7 동아리 과제' 카테고리의 다른 글
리버싱 9차시 과제 (0) | 2022.08.16 |
---|---|
리버싱 8차시 과제 (0) | 2022.08.10 |
리버싱 6차시 과제 (0) | 2022.08.02 |
리버싱 5차시 과제 (0) | 2022.07.31 |
리버싱 4차시 과제 (0) | 2022.07.26 |