일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 한국정보보호산업협회
- 무료교육
- 한국산업인력공단
- 개인정보안전성
- 모듈러 연산
- 유클리드_알고리즘
- 가명정보처리
- package-lock.json
- 동적타이핑
- 백엔드
- 호이스팅
- 디오판투스 알고리즘
- Writeup
- 덧셈 암호
- 마감임박
- 곱셈 암호
- 확장 유클리드 알고리즘
- node.js
- package.json
- 개인정보보호위원회
- arrow function
- pwnable.tw
- 웹 프레임워크
- 백엔드입문
- 포너블
- 국가인적자원개발컨소시엄
- 한국정보보호산업협회기자단
- 개인정보보호교육
- function scope
- 개인정보보호
- Today
- Total
목록reversing (5)
짱짱해커가 되고 싶은 나

Keygen 문제다. IDA로 코드를 확인해보자. 일단 Str1에 키를 입력받고 stricmp(Str1, Str2)를 하는 것을 확인 할 수 있다. strcmp는 많이 봤지만 stricmp는 처음 봐서 찾아봤더니 대소문자의 구분 없이 비교하는 함수라고 한다. 그러면 우리는 Str2에 있는 값이 key니까 이 값을 찾으면 된다. 어 그런데 Str1을 입력받고 나서 sprintf로 Str2에 값을 쓰는 것을 확인할 수 있다. Foramt 배열에 있는 값들을 잘라서 넣고 있는데 처음에 화면에 Format을 프린트하니까 우리는 Format배열을 알 수 있다. 따라서 Str1에는 Asm07REC 가 들어있다.

문제 분석 무슨 값을 입력하고 check를 누르면 wrong이 뜬다. readme 텍스트는 없지만 correct가 되는 어떤 값을 찾으면 될 것이다. GetDlgItemInt 함수가 입력받는 부분이다. 숫자를 입력받은 다음에 4084d0에 eax값, 즉 입력받은 값을 저장한다. 그리고 0x0040466f를 호출하고 404690으로 jmp, 401084로 jmp를 한다. 여기서 401084로 jmp하면 correct를 얻을 수 없으니까 이 부분을 해결하면 될 것 같다. 0x40466f를 보면 eax에 90(nop)을 넣고 retn 종료한다. 아닌가? ecx + 4084d005에 al을 더한다. 그리고 bh += al, eax += 601605c7, 4084d0++, 4084d0 ++을 한다. ?ㅜ 잘 모르..

readme를 보니까 1분 밖에 재생이 안 되고 1분 이상 들으면 flag가 나온다고 한다. 일단 실행시키려고 mp3 파일을 넣었는데 다음과 같은 에러 창이 떴다. 그래서 mp3파일의 확장자를 wav 파일로 변환시켰다. 그랬더니 잘 작동했다. 1분이 되니 다음과 같은 메시지 창이 떴다. IDA로 분석하려 했는데 디컴파일러가 안 됐다. 이유를 찾아보니 이 파일은 비주얼 베이직 프로그램이기 때문에 안된다고 한다. 그래서 올리디버거로 분석했다. call하는 함수 목록을 보는데 MsgBox가 보인다. MsgBox를 호출하는 부분이 4군데 있어서 모두 bp를 걸었다. 그리고 실행을 시키는데 파일을 불러오려고 open을 누르면 계속 렛 나고 실행이 안되서 찾아보니까 경로를 바로 넣으라고 해서 그랬더니 잘 돌아갔다...

프로그램을 실행 시켰더니 그냥 꺼졌다. 띠용 readme 파일을 확인해보니 OEP를 찾으라고 한다. OEP란? unpacking을 할 때 packing되기 전으로 돌아가는 곳이라고 한다. 그래서 OEP를 알면 원본 파일의 분석이 가능하다고 한다. 일반적인 packer는 처음에 모든 레지스터들을 스택에 push한 뒤 unpack 작업을 위한 루틴을 시작한다고 한다. (백업용) unpack루틴이 끝난 후에 원래 프로그램의 entry point를 시작하기 전에 처음에 스택에 저장한 레지스터들을 pop하는 형식이다. (pushad와 popad가 한쌍이 된다) 처음 push로 스택에 레지스터들을 올려놓은 후 EDI 레지스터에 bp를 걸면(F2) unpack루틴이 끝난 후에 프로그램을 시작하기 위해 레지스터드를 p..

파일을 실행시켜보니 이름 입력받고 시리얼을 입력받고 종료된다. readme 텍스트에는 시리얼 번호가 5B134977135E7D13일 때의 이름을 찾으면 된다고 한다. IDA로 분석해보자. 보니까 v9에다가 이름을 입력하고 이걸 가지고 v13에 시리얼 번호를 만들어서 저장한다. 그리고 시리얼 번호를 v9에 입력하고 이름으로 만들어진 시리얼 번호랑 같은지 확인하고 같으면 정답을 출력한다. xor은 역연산이 같으니까 시리얼 넘버를 넣어서 하면 될 것 같다. v6에는 16이 들어가 있다. 16 == 0x10 그리고 i=3이후부터는 i=0이 되니까 3의 배수일 때는 그냥 v6. 그러면 v6+i가 될 수 있는 값은 v6+0 v6+1 v6+2의 반복일 것으로 추측된다. 아! 노우!!! &v6!! v6+1은 v7인데 ..