Reverse Engineering(12)
-
rev-basic-5 풀이
rev-basic-4 문제에서 그랬던 것처럼 byte_140003000안에 들어있는 16진수들로 char형 배열을 만들어줍니다. 그리고 sub_140001000() 함수의 if문 조건식을 보겠습니다. 저번 문제와 동일하게 조건식을 통과하면 Correct 판정이 되는 형식입니다. 이번 문제는 바로 식이 나오지 않아서 직접 배열을 그려가며 풀었습니다 5 4 8 3 2 1 위와 같은 배열이 있을 때 각 배열의 값은 아래와 같을 것입니다. (맨 마지막 인덱스는 0) 1=a[5]+0 2=a[4]+a[5] 3=a[3]+a[4] 8=a[2]+a[3] 4=a[1]+a[2] 5=a[0]+a[1] 이렇게 됐을 때 뒤부터 차례대로 계산을 하게 되면 사용자가 입력한 배열인 a를 알 수 있게 됩니다. 주어진 Hex로 예시를 들..
2021.11.03 -
rev-basic-4 풀이
sub_140001000() 함수의 return값에 따라서 Correct, Wrong가 결정되므로 함수 안에 들어있는 for문을 분석하겠습니다. 그리고 for문을 돌리는 횟수가 0x1C(10진수로 28)인데, byte_140003000에 들어있는 16진수가 기준인 듯합니다. if문에 들어있는 수식에 해당되지 않는다면 Correct가 나오게 됩니다. [if문에 들어있는 수식] (arr[i]4 이제 이 수식을 기반으로 C++ 코드를 짜 보겠습니다. 별다른 역연산은 필요하지 않을 듯합니다. #include #include using namespace std; unsigned char arr[28]={0x24,0x27,0x13,0xC6,0xC6,0x13,0x16,0xE6,0x47,0xF5,0x26,0x96,0x..
2021.10.29 -
rev-basic-3 풀이
sub_1400011B0(), sub_140001210() 함수들은 별로 중요하지 않은 함수이기 때문에 분석은 넘어가겠습니다. sub_140001000() 함수를 보면 for문을 24번 돌려서 xor 연산을 하고 있는 걸 알 수 있습니다. byte_140003000에 뭐가 있는지 확인해보겠습니다. 16진수들이 쭉 나열되어있습니다. 저 수들을 연산하는 것 같은데, sub_140001000() 함수의 return값이 1일 때 Correct가 되므로 if문에 나온 조건식을 역연산하여 코드를 짜고 돌리면 FLAG가 나올 것 같습니다. 코드는 C++로 작성해보겠습니다. #include #include using namespace std; char arr[24]={0x49,0x60,0x67,0x74,0x63,0x6..
2021.10.28 -
rev-basic-2 풀이
우선 IDA로 파일을 열어서 main() 함수에서 쓰이는 함수를 세 가지 가져왔습니다. main() 함수에서 if문을 보면 sub_140001000()의 반환 값에 따라서 correct인지 wrong인지 판별이 됩니다. 그러므로 sub_140001000() 함수를 분석해보겠습니다. for문을 돌리면서 aC의 인덱스와 비교를 합니다. aC가 문자열인지 배열인지는 모르겠지만, 우선 구성을 알기 위해 aC 함수를 보도록 하겠습니다. 문자들이 쭉 나열되어있는 걸 볼 수 있습니다. 여기에 나오는 문자들을 하나씩 이어 붙여보면 FLAG가 나올 것 같습니다. (FLAG 획득 완료?) 간단한 문제였습니다. 목표는 rev-basic 시리즈 올솔!
2021.10.28 -
리버싱 실전 | 워게임 풀이 - Ubuntu Linux
- main 파일 분석 (반복문 전) 우선 main 파일 분석이 우선일 것 같아 메모장에 적어가며 분석했습니다. s : 사용자가 입력한 문자열이 들어가는 string형 변수 0x555555755080 dest : s가 복사될 변수 0x5555557550c0 n : s의 길이가 담겨있는 변수 a : rbp-4 b : rbp-8 c : rip+0x2076c d : rip+0x2007dd 1. read 0, s, 0x31가 인자로 들어간 상태에서 입력을 받습니다. +) read 함수는 자세하게 분석 하지 않아도 될 것 같아서 딱 여기까지만 하고 끝냈습니다 2. strlen 사용자가 입력한 s라는 문자열의 길이를 반환합니다. +) 이것 역시 이정도 정의만 생각해놓고 생략 3. strcpy strcpy에 dest..
2021.05.31 -
pwndbg로 C 소스파일 분석하기 - Ubuntu Linux
- 사전 준비 #include int test(int num){ if (num == (100%260)){ return 1; } return 0; } void win(int a, int b, int c, int d, int e){ printf("good\n"); } void lose(){ printf("bad\n"); } int main(){ int num; int res; printf("Enter Num : "); scanf("%d", &num); res = test(num); if (res == 1){ win(1,2,3,4,5); } else if (res == 0){ lose(); } return 0; } 우선은 vim을 사용하여 위와 같은 내용의 소스파일을 만들고 ESC -> :wq로 저장을 해줍니..
2021.05.26