Layer7 동아리 과제

리버싱 7차시 과제

msh1307 2022. 8. 8. 17:20

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