rev-basic-6
sub_140001000에 들어가서 디컴파일한 거 보면
이렇게 되어있다.
byte_140003020[a1[i]]와 byte_140003000[i]가 같으면 된다.
byte_140003000[i]가 byte_140003020[] 배열 안에 있으면 된다.
위와 같이 코드를 짜서 byte_140003000[i]가 byte_140003020[] 배열 안에 있는지 확인하는 코드를 짜면 flag를 구할 수 있다.
rev-basic-7
sub_140001000 들어가서 디컴파일 해보면
위와 같이 나온다.
__ROL1__이 뭔지 몰라서 어셈블리어를 봤더니 rol 명령이 있는 것을 확인할 수 있다.
검색해보니 일반 쉬프트 연산이랑 비슷한데 쉬프트 하다가 비트가 넘어가면 반대편으로 다시 넣어주는 그런 명령이라고 한다.
그래서 rotate라고 이름 붙인것 같다.
ror과 rol은 쉬프트 연산처럼하고 넘어가는 부분을 붙여줘야 돼서 저렇게 계산한다.
아래 더 직관적으로 나타낸 함수가 있는데, 저거 대신 사용해도 상관없다.
아까 rol 했으니 ror 해주고 i 랑 xor 했었으니까 bytes에 xor i를 해주면서 역산해줬다.
rev-basic-8
sub_140001000에 들어가서 디컴파일 해보면
0xfb(251)과 입력값 1바이트 잘라서 곱하고 그 값이 byte_140003000[]과 같으면 조건문이 통과된다.
0xfb를 곱해서 1바이트로 잘랐으니 하나하나 다 넣어보면서 확인하면 된다.
byte는 기본적으로 unsigned char로 표현되니 unsigned char로 해주고, 하나하나 다 돌려보면 된다.
'Layer7 동아리 과제' 카테고리의 다른 글
리버싱 10차시 과제 (0) | 2022.08.23 |
---|---|
리버싱 9차시 과제 (0) | 2022.08.16 |
리버싱 7차시 과제 (0) | 2022.08.08 |
리버싱 6차시 과제 (0) | 2022.08.02 |
리버싱 5차시 과제 (0) | 2022.07.31 |