flag_gen() 함수를 호출하라고 한다.
undefined8 main(void)
{
undefined8 local_f8;
undefined8 local_f0;
undefined8 local_e8;
undefined8 local_e0;
undefined8 local_d8;
undefined8 local_d0;
undefined8 local_c8;
undefined8 local_c0;
undefined4 local_b8;
undefined local_b4;
undefined local_a8 [80];
undefined local_58 [72];
uint local_10;
uint local_c;
local_c = 0;
puts("---Counter---");
for (local_c = 10; 0 < (int)local_c; local_c = local_c - 1) {
printf("%d\n",(ulong)local_c);
if (local_c == 3) {
local_f8 = 0x38383830357b4d49;
local_f0 = 0x6a37386a32336a39;
local_e8 = 0x3035363435676a39;
local_e0 = 0x6a68383234303438;
local_d8 = 0x6838306969326968;
local_d0 = 0x3833356a68693437;
local_c8 = 0x3667376a33343568;
local_c0 = 0x68696a386b6a356b;
local_b8 = 0x7d663232;
local_b4 = 0;
memcpy(local_58,&local_f8,0x45);
}
}
if (local_c == 5) {
puts("Nice!");
local_10 = local_c;
flag_gen(local_58,local_a8,local_c);
printf("\n%s\n",local_a8);
}
else {
puts("---END---");
}
return 0;
}
ghidra로 분석해서 코드를 보니 이렇게 되어있다.
local_c가 10에서 0까지 for문을 도는데 flag_gen은 c가 5일 때 호출되고 for문 밖에 있다.
즉, c가 for문을 다 돌면 0이 되기 때문에 flag_gen이 호출되지 못한다.
그래서 여기서 001015aa 에 있는 CMP 코드에서 0x5랑 비교하는걸 0x0으로 패치하고 패치한 파일을 실행해봤다.
이렇게 나온다.
플래그 형식은 DH{}인데 IM{}인걸 보니 잘못됐다.
for문을 다 돌고 나서 flag_gen을 실행하면 for문 안에서 값이 바뀌는 변수들 때문에 flag_gen의 결과값도 달라지는거 같다.
for문을 도는 중에 c가 5가 되면 flag_gen이 실행되어야 한다.
이번에는 for문을 c가 5면 나오게 설정했다.
하지만 실패했다.
for문 안에서 c가 5가 되면 호출이 되어야 한다면, c가 5일 때 for문을 나오고 flag_gen이 실행되어도 성공해야 한다.
하지만 실패한걸 보니 for문이 다 끝나고 flag_gen이 호출되는게 맞는 것 같다.
그런데 아까 실패한 이유는 c가 0이기 때문인 것 같다.
보면, local_10을 c값으로 바꾸고 flag_gen에도 c가 인자로 들어가기 때문에 c가 0이 아니라 5여야 하는 것이다.
if문이 시작되기 직전에 c값을 5로 바꿔주려고 했는데 ghidra에서 패치를 하니까 자꾸 에러가 생겨서 gdb로 해봤다.
main을 disassemble 해본 결과, flag_gen이 나오기 전 main+278 주소에서 0x5와 비교를 하고 있다.
rbp-4위치에 있는 값이 c이니까 해당 값을 5로 바꿔주면 된다.
p 명령어로 rbp-4의 주소를 얻어오고
해당 주소의 값을 5로 set해준다. (주소니까 포인터 써준다)
세팅 했으면 c로 continue 해주면 플래그가 출력된다.
'리버싱' 카테고리의 다른 글
드림핵 Batch Checker (0) | 2024.06.01 |
---|---|
드림핵 Easy Assembly 롸업 (0) | 2024.05.30 |