
이 문제를 풀었다~
x32dbg로 입력값 검증 함수를 보면

이렇게 생겼다. 31번 반복한다!
실행해보며 확인한 비교과정을 정리해보면!
반복 횟수는 rax에 저장되어 1씩 증가한다.
이런 과정이었다.
이 문제는 분석은 빨리 했는데 코드 구현하는 게 진짜 오래 걸렸다......(일단 rol이 뭔데;;;)
(rol(입력값, rax%8)^rax)==7FF7A3C03000[rax]를 확인하는 거니까
입력값==ror(7FF7A3C03000[rax]^rax, rax%8)
하면 되지 않을까? 생각했는데... 일단 rol ror 함수로 구현하는 것부터 애먹었다.
디버깅하면서 보니까 11010101을 왼쪽으로 3만큼 비트회전시키면 10101010이 되어야했다. 그니까... 그대로 떼어다 붙여야하는데! 자바에서 시프트연산을 반복하면 거꾸로 붙으니까 이걸... 어케해야하나...... 챗지피티한테 물어봐도 rol이 동작하는 방식으로 구현을 안 해주는 거시엇다~ 그래서 뭐... 구글링햇당ㅋ.ㅋ
...엥. 아까는 거꾸로 찾는 거 안 됐는데 왜 되지;;
아무튼 코드를 보면!
import java.util.Scanner;
public class rev {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dump= {0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9, 0x26,
0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E, 0x00};
for(int i=0;i<31;i++) {
System.out.print((char)(ror(dump[i]^i, i%8)));
}
}
public static int ror(int al, int cl) {
int shift=al>>>cl;
int src=al<<(8-cl);
src&=255;
return shift|src;
}
}
...아까는 안 됐던 코드... 갑자기 되넹
import java.util.Scanner;
public class rev {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dump= {0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9, 0x26,
0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E, 0x00};
for(int i=0;i<31;i++) {
for(int j=0;j<128;j++) {
if((rol(j, i%8)^i)==dump[i]) System.out.print((char)j);
}
}
}
public static int rol(int al, int cl) {
int shift=al<<cl;
shift&=255;
int src=al>>>(8-cl);
return shift|src;
}
}
이거는 안 되길래 반복문 돌리면서 입력값 맞을 때 출력하게 한 코드
아무튼 결과는~!

히히~
flag: Roll_the_left!_Roll_the_right!