일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 강의
- ctf
- 2021
- probgame
- 워 게임
- reversing.kr
- c언어
- 라이트업
- 시탭
- 히공
- vsCode
- 코드엔진
- Basic
- hackingcamp
- write up
- 풀이
- 리버싱
- 리버스 엔지니어링
- 변수
- 해킹캠프
- write-up
- 라업
- 뭉뭉
- 라이트 업
- reversing
- 드림핵
- PYTHON
- web
- ShaktiCTF
- 파이썬
목록write up (15)
히공

문제 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 v3; // rbp const char *v4; // rsi const char *v5; // rdi __int64 v6; // rdx int result; // eax unsigned __int64 v8; // rcx unsigned __int64 v9; // rt1 const char **v10; // [rsp-48h] [rbp-48h] __int64 v11; // [rsp-38h] [rbp-38h] __int64 v12; // [rsp-30h] [rbp-30h] __int64 v13; // [rsp-28h] [rbp-28h] __int64 v14; // [rsp..

문제 메인 함수 transform 함수 원격 디버깅을 사용했는데 segment fault가 뜬다. (v4가 0이란 값을 가지고 있기 때문이다. write 할 수 없는 영역) bec = [int(i,16) for i in '77 41 50 63 55 4C 5A 68 7F 06 78 04 4C 44 64 06 7E 5A 22 59 74 4A'.split()] flag = '' for i in range(len(bec)): if (i&1): flag += chr(bec[i] ^ 0x37) else: flag += chr(bec[i] ^ 0x13) print(flag) 간단하게 풀 수 있다. 플래그 : dvCTF{I_l1k3_sw1mm1ng}

15번 문제를 풀어보겠습니다. 이러한 문제입니다. name, serial을 입력하고 Check it ! 을 누르면 정답인지 아닌지 확인합니다. 이런식으로 확인합니다. 패킹은 안되어있습니다. x32dbg에서 실패했을때 나왔던 Try Again으로 검색해보았습니다. 이런 코드를 발견했습니다. bp가 있는곳이 분기점 입니다. 한번 Name에 CodeEngn, 비번에는 1234를 넣고 f9를 눌러서 eax값과 45B844의 값을 확인해보겠습니다. eax값 입니다. 제가 입력했던 비밀번호 입니다. 덤프 따라가기로 45B844의 값을 확인해보겠습니다. (dword ptr 로 받아오니 4바이트만 비교합니다.) 0x6160 입니다. (리틀엔디안이기 때문에 반대로 봐야합니다.) 0x6160은 10진수로 24928입니다...

13번을 풀어보겠습니다. 정답을 구하라고 합니다. 그냥 정답을 입력하는 프로그램 입니다. C#으로 만들어졌습니다. 한번 디컴파일 해보겠습니다. dotpeek 으로 디컴파일 해보았습니다. visual studio로 열어주었습니다. str의 값을 알아내야 합니다. (C#을 몰라도 풀 수 있는 문제입니다. 저는 C# 몰라요.) 그냥 str를 출력하도록 변경 답 : Leteminman

12번을 풀어보겠습니다. 패킹은 안되어 있습니다. cmp, jne로 eax와 7A2896BF가 같으면 점프를 하지않고 맞췄다는 메세지박스를 출력합니다. 7A2896BF(16진수)는 10진수로 2049480383 입니다. 헥스 에디터로 오픈했습니다. (2번째 문제 풀때쓰던것) 이걸로 이제 맞았다고 출력되는 부분을 살펴봅시다. Congratulation부터 right key까지 출력되는 부분입니다. 2049480383이거를 복사 수정되었습니다. Key : 2049480383 영역 : 0D3B0D45 합치면 : 20494803830D3B0D45 입니다. 성공! 답 : 20494803830D3B0D45 ++ 추가로 컨트롤 + s로 저장하고 실행하면 오류가 뜹니다. 원인은 여기서 파일크기를 변경합니다. 이것이 문..

11번을 풀어보겠습니다. 이러한 문제입니다. UPX로 패킹이 되어있습니다. oep로 가는 jump발견 oep 발견 oep주소는 00401000입니다. Messageboxa의 인자는 4개여야 하는데 1개만 있습니다. 그러면 oep로 오기전 3개의 인자가 있겠지요? 그리고 nop의 개수는 12개. 12byte입니다. 12byte가 oep로 오기전에 있을것입니다. 그 훔쳐온 코드를 nop부분에 입력하면 00401000부터 재대로된 코드이기 때문에 oep는 00401000입니다. popad이후 12byte를 보니 0040736D~00407375가 12byte이다. 그리고 3개의 인자 딱 저 부분입니다. 저 부분이 stolenbyte가 되는것입니다. stolenbyte : 6A00680020400068122040..

립케알에 2번째 문제를 풀어보겠습니다. 이러한 프로그램입니다. Reame.txt입니다. 시리얼이 저 값일때 네임값이 뭐냐고 물어보는군요. ida 헥스레이로 분석해보니 Name값으로 어떤 문자열을 만들고 시리얼하고 비교하는 문제 같습니다. 아무값이나 넣어보고 디버거로 확인해 봅시다. scanf로 받는 부분입니다. [esp+10]부분이 입력한 네임값 입니다. 여기가 이 for문의 해당하는 부분입니다. 40107c에서 ecx에 esp+esi+C부분에 있는 값을 넣는데 보니까 0x10,0x20,0x30이 배열형태처럼 저장되어 있었습니다. ecx 에는 0x10,0x20,0x30이 번갈아 가면서 들어가고, edx 에는 네임의 요소들이 하나하나 들어갑니다. 그리고 둘을 xor연산한 값을 16진수 형태로 문자열로 만들..