일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- write up
- 강의
- 라업
- reversing.kr
- 파이썬
- hackingcamp
- 라이트 업
- 리버스 엔지니어링
- Basic
- 뭉뭉
- 변수
- 히공
- web
- 해킹캠프
- PYTHON
- probgame
- ShaktiCTF
- 2021
- 드림핵
- write-up
- 시탭
- reversing
- 풀이
- vsCode
- 코드엔진
- c언어
- 리버싱
- ctf
- 워 게임
- 라이트업
목록전체 글 (108)
히공
문제 dvm-rev sub_14A3이 가장 중요한 함수다. 이러한 함수다. ida 리모트 디버깅을 쓴다. 인자로는 opcode를 준다. f9를 누른다. jmp rax가 굉장히 중요하다. 아무거나 입력해준다. call하는 부분으로 오게 된다. 안은 이러했다. memcmp로 가는 것을 볼 수 있다. unk_7F4ABDDDFF00 = memcmp 끝나고 rsi 주소로 가보면 여기 주소와 비교하는거다. 코드를 패치하여 검사를 통과하도록 만들었다. 총 3번 입력받는다. opcode : S가 출력되면 입력을 받는다. opcode : P가 출력되면 memcmp를 호출한다. RAX값을 보니 8개를 입력받는 것을 알 수 있다. (read 함수 호출 후) 여기를 보면 sub_1100는 write함수로 이동하는 함수라고 알..
문제 please_analysis_me 파일의 main 함수다. cypher_code가 굉장히 중요해 보였다. 여기서 get_key가 굉장히 중요해 보였다. get_key의 리턴 값이 v7에 들어가는데 v7은 char형이다. 그러면 cypher_code에서는 어떠한 부분을 0x1C로 xor 한다고 볼 수 있다. get_key 함수다. 어차피 char형이 들어가므로 1바이트만 들어간다. 0x1C가 v7에 들어간다. (리틀엔디안) please_analysis_me는 elf 섹션 중 어느 곳을 암호화하는 것 같았다. opps_I_cannot_execute파일을 ida로 열어준다. 코드가 이상하다. shift+f7을 눌러 섹션을 본다. text를 0x1C로 xor 해줄꺼다. 0x1140~0x1AE5 부분 까지 ..
문제 revtine파일 하나가 있다. Ch0c0l4te_v3_1, Ch0c0l4te_v3랑 같은 친구다. 왜 두 개로 나뉜 것인지 모르겠다. Ch0c0l4te_v5는 "Ch0c0l4te"로 고정된다. 저 sub_1000036E0는 각 요소를 0xA와 xor하는 함수다. 여기서 free 해주는 것을 보아 분석할 필요가 없는 함수라는 것을 알 수 있다. 여기도 페이크 루틴이 많다. 여기가 가장 중요하다. sub_1000037F0 함수다. 암호화를 하는 것을 볼 수 있다. 여기에 인자로 들어가는 off_100008078가 많이 중요하다. off_100008078다. 문자열 중 이러한 문자열이 있다. 해석하면 나의 마음을 반대로 읽을 수 있느냐? 이런 뜻입니다. 여기서 복호화 코드를 만들어야 한단 것을 유추할 ..
문제 문제 파일들 UPX 패킹이다. 언패킹을 진행한다. 실행화면 ida에서 본 화면이다. 2를 입력했을 때 나오는 것들 여기서 1을 입력했을 때 sub_401080을 호출하는데 저게 굉장히 중요하다. 여기서 딱 수상한 루틴이 있다. 변수들 x32dbg로 풀었다. 메인함수 mov eax, dword ptr fs:[0x30] movzx eax, byte ptr [eax+0x68] NtGlobalFlag이다. 디버깅 중인지 아닌지 판단할 때 사용된다. 디버깅 중이면 0x70을 반환하고 아니면 0을 반환한다. 현재 eax값이 0x70인 것을 볼 수 있다. 패치를 통해 넘어가자 안티디버깅을 우회 했다. 이 부분에 bp를 걸어준다. 실행한다. 2를 입력한다. 그 후 여기에 bp를 걸고 1을 입력해준다. 이 함수가 ..
문제 메인함수다. 인자로 문자열 2개를 받는다. 2번째가 AA.....sks여야 한다. v15, v14에 인자1, 인자2를 복사한다. v15를 오픈하고 리턴 값을 v10에 저장한다. 두 번째 인자를 argv_s_2에 넣는다. 매우 중요한 핵심 루틴이다. v10(첫 번째 파일) 을 4바이트씩 끊어서 read_value에 집어넣는다. 그 후 for을 총 6번을 돌려 0x10과 xor 해준다. 그 후 두 번째 파일에 write를 4바이트씩 한다. 간단하게 코드를 만들 수 있다 name = "Data.enc" with open(name,'rb') as f: read_file = f.read() read_file = bytearray(read_file) write_byte = bytearray() for i in..
sSsSSsSSssSSsSsSsSssSSSSSSSssS{SSSsSsSSSsSsSSSsSSsSSssssssSSSSSSSsSSSSSSSSsSSsssSSssSsSSSsSSsSSSSssssSSsssSSsSSsSSSs} 문제 입니다. { 전 문자열의 길이가 30입니다. 플래그 형식이 utflag{}인 것을 생각했습니다. utflag의 길이는 6이고 그래서 한 문자당 5개의 s, S를 쓴다고 생각했습니다. 소문자 s는 1 대문자 S는 0 이런 식으로 변환해주고 97을 더해주면 됩니다. st = 'SSSsSsSSSsSsSSSsSSsSSssssssSSSSSSSsSSSSSSSSsSSsssSSssSsSSSsSSsSSSSssssSSsssSSsSSsSSSs' plus_num = 97 ls = [st[i:i+5] for i i..
문제 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}