본문 바로가기

전체 글38

Basic L17 문제는 다음과 같다.지금까지의 문제와는 다르게 키를 가지고 Name을 유추해야 한다. DIE로 봤을때 패킹은 되어있지 않았다.문제 힌트로 Name은 한 자리 라고 했으므로 알파벳 하나만 넣고 키를 넣은후 Check it을 눌러봤다.하지만 보다시피 문자를 1개만 넣었더니 더 길게 쓰라고 한다. 디버거에서 이 문자열을 검색해봤다.해당 위치로 이동한다.eax값을 3과 비교후 넘어오는걸로 봐서 3자 이상을 넣도록 설정되어있다.해당 구문을 1로 바꾸고 패치한다. 패치한 파일을 디버거에 올리고 아까처럼 a하나만 입력후 실행해봤다.한 줄씩 실행하다 보면 45b850함수를 호출한 직후에 코드가 생겨나는것을 확인 할 수 있다, 이 함수를 분석해보자.45b850함수를 실행하다 보면 처음으로 마주치는 암호화 로직이다. 위 .. 2026. 9. 19.
Basic L16 문제는 다음과 같다.DIE로 열어보았을때 패킹은 되어있지 않았다.프로그램을 실행하면 다음과 같이 뜬다. 디버거에서 문자열을 검색했다.바로 성공 메시지가 보이지만 사용자의 입력을 받아오는 부분을 찾고 싶기 때문에 Enter your name부분으로 갔다.아마 43C3D8부분이 출력함수 인것 같다.43D758이 입력 함수 이다.코드의 흐름을 쭉 따라가다 보면 암호화 과정이 나온다.우선 412430을 호출하면 Name의 문자열 길이가 eax에 저장된다.현재로썬 값이 8이다. 0x8이 값을 스스로 더하고 (x2) 0x10그값에 문자열 길이를 더한다. 0x18그후 shl을 통해 2배곱을 해준다. 0x60이 값을 제곱한다. 0x2400이값에 0x60만큼 곱한다. 0xd80000x17을 더한다. 0xd8017 이 후.. 2026. 9. 19.
Basic L15 문제는 다음과 같다.DIE로 열어봤을때 패킹은 되어있지 않았다.Serial에 아무 값이나 입력하니 숫자를 넣으라고 나온다.숫자를 입력하면 위와 같이 나온다. 이제 디버거에 올려서 디버깅을 시작해보자.Try Again이라는 문자열로 탐색을 해보았다.아마 44496C라는 함수가 메시지 박스를 만드는 함수 인것 같다.그리고 위에 성공 메시지도 보이는데 이 둘의 분기점은 cmp eax. [45B844]문 이후 jne .. 이다.해당 부분이 BP를 걸고 레지스터 및 덤프창을 확인해보았다.eax값을 보면 4d2, 즉 사용자가 입력한 1234를 숫자로 변환해서 가져왔다.45b844위치에는 0x6160이 있다.6160은 10진수로 24928이므로 시리얼은 24928이다. 하지만 여기서 바로 끝내기 보다는 저 6160이.. 2026. 9. 18.
Basic L14 문제는 다음과 같다.DIE로 열어보니 UPX패킹이 된걸 확인 할 수 있다.우선 패킹을 해제 한 후 덤프를 떠서 저장시켰다.이제 언패킹된 덤프를 디버거에 올리고 실행해봤다.우선 프로그램은 아래와 같이 입력창이 두 개 존재하고 체크 버튼으로 키를 확인한다.어셈블리 코드를 봤을때 위 프로그램은 윈도우API를 사용하므로 텍스트를 가져오기 위해서 GetDlgItemText라는 함수를 호출 할 것이다.모듈간 호출을 검색해보니 정확히 GetDlgItemTextA함수가 2개 보인다.위와 같이 나란히 GetDlgItemTextA함수가 보인다. BP를 걸고 사용자의 입력을 어떻게 가져오는지 확인해봤다.위와 같이 403038주소에는 첫번째 입력창, 403138주소에는 두번째 입력창 내용을 가지고 와서 각각 길이가 0보다 큰.. 2026. 9. 18.
Basic L13 문제는 다음과 같다.일단 DIE로 열어보았다.패킹이 되어있는것은 아니다. 하지만 닷넷 C#으로 빌드 되어있다. 디버거에 올리면 실행이 되지 않는다. 그러므로 dotPeek이라는 닷넷 전용 디스어셈블러를 이용해서 해결하면 된다.dotPeek으로 연 후 RijndaelSimpleTest를 열었다.프로그램 실행시 나오는 사용자의 입력을 str과 비교후 성공여부를 확인한다.str의 값을 확인하면 된다.우선 프로젝트로 익스포트후 VisualStudio로 열었다.위와 같이 반복문 시작부분에 bp를 걸고 실행하면 str의 값을 확인 할 수 있다.보다시피 값은 Leteminman 이다. 정답을 구하라고 했으므로 답은 Leteminman 이다. 2026. 9. 18.
Basic L12 문제는 다음과 같다.DIE로 봤는데 따로 패킹이 되어있는것 같진 않았다.OEP에서 바로 보이는 코드는 GetDlgItemInt였다.입력창에서 사용자가 입력한 키를 숫자로 가져와서 읽는 함수다. 그리고 밑에 Congratulation이라는 문자열이 보이는걸로 봐서 여기가 키를 읽고 비교하는 부분이 확실하다. 우선 숫자를 입력으로 받는 프로그램이므로 12345를 입력해봤다.GetDlgItemInt의 반환값으로 EAX레지스터에 0x3039 (12345)가 저장되었다.그 후 뭔가 특이한 반복문을 통해서 EAX의 값을 변조시키는 부분이 있는데 cmp eax, 7a2896bf 시점에서 GetDlgItemInt의 반환값으로 EAX는 다시 되돌려져있었다.즉. 중간에 있는 반복문은 아무의미 없는 페이크 였다. 그래서 결.. 2026. 9. 18.
Basic L11 문제는 다음과 같다.DIE로 열어보니 UPX 패킹이 되어있다.패킹을 해제한 후 StolenByte를 찾아서 정확한 OEP를 찾으면 된다.popad위치에 도달하니 프로그램을 처음 시작시 나오는 메시지 박스 안의 내용들이 보인다.저 부분이 StolenByte로 의심된다.우선 jmp문을 통해서 EP로 가보자.역시나 매개변수가 하나밖에 보이지 않는다.그러므로 이전에 40736e ~ 407375까지의 코드가 StolenByte이다.그러면 이 Stolenbyte만 따로 구하면 6A0068002040006812204000 이다.그러면 Original Entry Point, OEP는 이 Stolenbyte크기 만큼이 40100C위치에 있었다는 가정하에 Stolenbyte의 사이즈인 12바이트 만큼을 빼주면 004010.. 2026. 9. 18.
Basic L10 문제는 다음과 같다.우선 프로그램을 실행해보면 다음과 같은 창이뜬다.여기서 Name이나 Serial칸에 뭔갈 입력하려고 해도 입력이 전혀 되지 않는다.우선 PEView로 열어보니 다음과 같았다.UPX패킹은 확실히 아닌데 일단 뭔가 일반적인 PE파일은 아닌게 확실하다. 그래서 Detect It Easy라는 프로그램을 이용해서 패킹 종류를 확인해봤다.ASPack이라고 쓰여있다.ASPack은 처음보는 패커이므로 일단 x32dbg로 실행을 해보자.UPX와 마찬가지로 pushad라는 구문이 보인다.UPX에서 한것처럼 하드웨어 BP를 걸고 popad구문으로 이동해보자.popad까지 이동을 했다. 여기서부터 F7로 한 단계씩 실행하는 ret을 만나서 445834로 이동했다.보다시피 언패킹이 되었고 OEP는 00445.. 2026. 9. 16.
Basic L09 문제는 다음과 같다.StolenByte를 구하라는 문제이다. StolenByte가 뭔지 잘 몰라서 검색해보니 다음과 같았다.언패킹을 했을때 덤프를 뜨기 어렵도록 원본코드 일부분을 패커 메모리 영역에 숨겨서 실행하는 안티 리버싱 기술이라고 한다.PEView로 확인했을때 UPX패킹이 되어있었으므로 우선 언패킹을 해보자.popad까지 언패킹을 하면 보이는 화면이다.jmp 40100c구문이 EP로 이동하는 구문이다.EP로 이동하게 되면 MessageBoxA함수를 호출하는데 매개변수가 0하나 밖에 보이지 않는다.공식문서에 따르면 매개변수는 총 4개가 들어가야 하는데 지금으로썬 hWnd 핸들변수 하나만 전달된 것이다.하지만 실행해보면 메시지 박스가 잘 띄워지는 것을 확인 할 수 있다.그 이유는 바로 이전에 그림2를.. 2026. 9. 15.