- Today
- Total
목록Pwnable/Reversing.kr (12)
Phantom
32비트 바이너리이며 stripped되어있어서 gdb로 확인은 불가하다. 이것도 correct 아니면 Wrong을 출력하는 프로그램같다 IDA로 열어봐야겠다. if문의 함수의 리턴값이 1일경우 아래 함수를 콜하고 끝나는것 같다. byte_20~25 까지 값이 있고 이걸 짜맞추면 될것 같다. 아직 코딩이 딸려서 무조건 값이 정해져있는것들을 미리 적어놓고 xor 연산을 하였다.
OEP(Original Entry Point)를 찾는 문제이다 패킹때문인지 EXE인건 확인이 되는데 다른건 확인이 안된다. 패커도 UPX같은게 아닌 자체적으로 만든건가 싶다. 호로로로로로로롤로 겁나 길다. IDA로 봐선 잘 모르겠다 한번 열어봐야겠다. 첫번째 루프 jmp로 계속 반복하며 je조건이 충족되면 40A0C3으로 이동한다. 그러니 40A0C3에 BP를 걸고 이동해보자 2번째 루프 VirtualProtect와 GetProcAddress로 프로세스를 불러오는것 같다. 전부 다 불러오면 JNZ조건이 충족하는것 같아보여 JNZ다음에 BP를 걸고 계속 진행해보자 3번째 루프 LoadLibraryA함수로 dll을 로드한다. 그리고 조건이 충족되면 JE로 점프하는것 같다. 40A13E주소에 bp를 건다. 4..
시리얼이 저것일때 이름을 찾아라 라는 문제이다. 역시 이번도 패킹은 안되어있다. 맞는 네임을 찾는 문제. IDA로 봤을땐 v9와 v13만 비교하면된다. 그럼 입력함수들과 동작하는 원리를 분석해보자. xor할 값 저장하는 부분. 입력값과 10,20,30을 xor값%입력값 길이 xor값[i%xor길이]로 순환하며 xor시킨다. 이 연산을 통해 Serial이 생성되는것 같다. 시리얼이 5B 13 49 77 13 5E 7D 13이니 2개씩 자른다면 8자가 된다. 시리얼과 10,20,30으로 xor연산하면 Name값이 나올 것이다.
C++로 짜여져있고 다른 패커는 없다. 한번 실행해보자 키값을 넣으면 incorrect 또는 correct를 출력하는 간단한 프로그램인가보다. IDA에서 열어보면 DialogBoxParamA 함수를 실행하는데 이 함수는 대화상자를 생성하는 함수이다. 3번째 인자에 대화 상자 프로시저에 대한 포인터가담긴다. DialogFunc 안에 있는 함수에 들어가보면 이 문제에 대한 부분이 나온다. if문의 조건을 달성하면 Correct부분이 나오는것 같다. String[v3] = 97('a') String[v4] ='5y' #앞의 a는 ascii의 약자이다. String[v5] = 'R3versing' String[0] = 69('E') 이것들을 합쳐보면 플래그가 나온다
이번 문제는 Replace이다. 글자는 입력이 되지 않고 숫자만 입력이 된다. 그리고 Check를 누르면 에러가 떠버린다. 우선 이게 뭐로 짜여진건지 봐야겠다. C++로 짜여져 있다. 이건 Wrong을 Correct로 바꾸는 문제같은데.. 일단 헥스레이를 이용한다. 우선 보니 입력과 출력함수에 대해 BP를 건다 GetDigItemInt의 리턴값은 입력한 값을 16진수로 리턴한다 분석을 하면 이렇다. 우선 값을 11111을 넣고 Check를 누르면 함수의 RET값으로 0x2B67을 리턴한다. 그리고 아래 함수에 들어가게 되면 Correct를 저장하고 0x4084D0에 있는 입력값을 2 증가시킨다. 후에 0x40466F함수를 실행하고 0x4084D0에 0x601605C7을 더하고 +1 증가시킨다. 0x408..
음... ELF바이너리 문제인데 Wrong과 Correct이런문제같다. 아직 PE와 ELF에 대해 자세히 공부하지는 않았다. 나중에 공부를 해야겠다 아무튼 gdb로 디버깅하려했는데 file명령어로 보니 stripped 되어있었다. IDA로 바이너리를 열어봐야겠다. Main 함수는 이렇다. xor_func를 보면 다음과 같다. 배열이 선언되는데 char[5]이다. 이 조건들을 간단히 하면.. char data[5]; data[0] = data[0] ^ 0x34 data[1] == '1' data[2] = data[2] ^ 0x32 data[3] = data[3] ^ 0x88 data[4] == 'X' data[5] ==NULL data[2] == '|'(0x7C) data[0] == 'x' -> data[..
This MP3 Player is limited to 1 minutes. You have to play more than one minute. There are exist several 1-minute-check-routine. After bypassing every check routine, you will see the perfect flag. 이것이 ReadMe에 적혀있는 문장이다. 이 MP3 Player는 1분으로 제한되어있다. 1분 이상 재생해야 한다. 몇몇의 1분체크루틴이 존재한다. 모든 체크루틴을 우회한 후에, 너는 완전한 flag를 볼 수 있을것이다. 라고 발번역을 하면 이렇게 된다 하핫.. 실행 모습은 이렇다. 그리고 1분이 지나면 이렇게 메시지가 출력되며 다시 위의 상태로 돌아간다. 우..
ReversingKr UnpackMe Find the OEP ex) 00401000 이번 txt파일에는 이렇게 적혀있었다 OEP를 찾으라는 것이다. OEP(Original Entry Point) : 프로그램의 진짜 실행 위치를 뜻한다. 패킹된 바이너리에서 언패킹을 하고 OEP로 가게 되면 원래 프로그램의 흐름이 보이게 되는 것이다. 문제는 패킹되어있으나 무엇으로 되어있는지 모른다. 직접 패킹을 풀어봐야 알것 같다. 음...UPX처럼 처음에 PUSHAD라도 있으면 POPAD를 찾을텐데 그런게 없다.. 직접 트레이싱을 해봐야겠다. 이 문제는 풀이는 쉽다 근데 하다보니 분석을 하게 되었다. 우선 kernel32.dll아스키값을 PUSH하고 LoadLibrary 함수를 실행시켜 라이브러리를 로드하고 라이브러리 ..
ReversingKr KeygenMe Find the Name when the Serial is 5B134977135E7D13 압축을 풀고 ReadMe.txt를 열면 저 문장이 나온다. 시리얼값은 찾은 듯 하고 이제 파일에 대한 분석을 해야겠다. 이번도 역시 C++로 짜여져 있다. 실행을 하면 다음과 같이 나온다. 맞지 않은 Name을 입력해서 그런지 Wrong이라는 메시지를 출력하고 프로그램은 종료 됐다. 이번도 역시 Wrong이라는 문자열을 추적해서 문제를 푸는 쪽으로 가봐야겠다. 역시나 분기문이 존재 했다. 입력 함수를 찾고 거기에 BP를 걸고 트레이싱을 한다. 이것이 XOR 루프인데 여기서 스트링을 XOR시켜버린다. 맨 아래부분은 문자열의 길이를 비교하고 JMP시키는 명령이다. 문자열의 길이는 루..
음.... 나는 리버싱을 다시만지는 것은 참 오랜만이다. 많은 정보를 듣고 머리로 저장만해두고 사용해본적이 오랜만이라는것 또한 같다. 그리고 나는 포너블과 취약점 분석을 더 잘하기 위해 리버싱을 시작했다. 시원포럼에 다녀와서 느낀것을 가지고 리버싱을 시작했다. 첫 문제는 Easy_CrackMe이다. 프로그램을 실행하면 막연히 이렇게 나온다. 저곳에 값을 넣고 확인을 누르면 이렇게 나온다. 이제 분석을 시작해보자. 우선 PEID로 본 결과 C++로 짜여진 것을 알 수 있다. 이뮤니티로 위에서 출력된 Incorrect Password를 찾아보자 위에 스트링 값을 추적해보면 분기가 존재하게 된다. 위로 올라가서 분기문을 추적해보자. 입력함수 아래서부터 비교값과 루프가 존재한다. 그리고 루프가 끝나는 지점에서 ..