완료됨
stage2 익스플로잇 코드
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
unsigned char byte_40E0[] =
{
103,198,105,115,81,255,74,236,41,205,186,171,242,
251,227,70,124,194,84,248,27,232,231,141,118,90,
46,99,51,159,201,154,102,50,13,183,49,88,163,90,
37,93,5,23,88,233,94,212,171,178,205,198,155,180,
84,17,14,130,116,65,33,61,220,135
};
unsigned char byte_4020[] =
{
64, 27, 22, 237, 137, 84, 235, 94, 235, 97,
244, 139, 208, 152, 161, 210, 2, 178, 158, 135,
141, 45, 190, 123, 230, 243, 169, 178, 95, 32,
27, 81, 194, 234, 133, 12, 142, 45, 67, 3,
137, 234, 242, 75, 198, 3, 17, 49, 81, 50,
25, 41, 64, 226, 19, 206, 54, 20, 19, 33,
127, 131, 0, 110
};
unsigned char byte_4060[] =
{
25, 44, 78, 36, 50, 53, 127, 35, 94, 49,
111, 98, 86, 94, 22, 120, 47, 38, 7, 90,
80, 33, 72, 67, 45, 10, 97, 25, 23, 4,
43, 83, 23, 106, 115, 29, 103, 11, 5, 60,
10, 22, 105, 75, 9, 74, 15, 12, 93, 107,
48, 41, 126, 24, 10, 72, 68, 54, 88, 116,
90, 30, 17, 55
};
unsigned char key[70] = {0};
int v0 = time(0LL);
srand(v0);
for (int k = 0; k <= 63; k++)
{
int v9 = rand();
for (int j = 33; j <= 127; j++)
{
int v8 = j + byte_40E0[k];
char cal = v8 - (((v9 - 0x800000) & (unsigned int)(v8 * (rand() % 64 + 0x10000))) >> 16);
if (cal == byte_4060[k])
{
key[k] = j;
break;
}
}
}
printf("%s\n", key);
return 0;
}
코드를 위와 같이 작성했는데 key를 출력해보면 값이 하나도 안나오네요.. 뭐가 문제일까요
#reversing
작성자 정보
답변
1
mini-chip
Perfect 10
안녕하십니까. 해당 코드를 읽어봤는데 1 byte brute-force를 시도하신 것으로 생각됩니다. 1 byte brute-force를 시도하는 과정에서 문제에 있던 코드를 그대로 복사-붙여넣기를 하신 것 같은데, 그 과정에서 실제 바이너리의 동작과 달라지게 된 것 같습니다.
문의 주신 코드에서 cal
값을 일일이 확인해 봤는데, 실제 바이너리에서 연산되는 결과와는 다른 값이 나옴을 확인하였습니다. 바이너리 내용을 포팅할 때 디컴파일한 코드를 단순 복사-붙여넣기 한다면 자주 실제 동작과 달라집니다. 이에 대한 대안으로, 1 byte brute-force를 디버깅 스크립트 혹은 후킹으로 수행하는 방법이 있습니다. 이 부분을 공부해 보신다면, 위와 같은 오류를 피하실 수 있습니다.
아래는 gdb에서 디버깅 행위를 자동화할 수 있는 gdb-script에 대해 정리해 놓은 블로그 포스트입니다. 해당 포스트에서 1 byte brute-force를 수행하는 방법이 간접적으로 소개되어 있으니 읽어보시면 도움이 되실 겁니다.