일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 시탭
- 라이트 업
- c언어
- ctf
- PYTHON
- write-up
- 풀이
- 해킹캠프
- 드림핵
- 변수
- reversing.kr
- 뭉뭉
- 2021
- 강의
- 리버싱
- vsCode
- reversing
- 라이트업
- hackingcamp
- write up
- 코드엔진
- 라업
- 리버스 엔지니어링
- 워 게임
- web
- Basic
- 히공
- probgame
- 파이썬
- ShaktiCTF
목록write up (31)
히공
문제 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}
SSTF의 CRACKME101 문제를 풀어보겠습니다. ida로 본 메인함수 rbp-78이 Dtd>=mhpNCqz?N!j(Z?B644[.$~96b6zjS*2t& rbp-70이 scanf로 페스워드를 입력받는것 rbp-70(입력한 페스워드값)을 인자로 넣는것을 볼 수 있다. 똑같은 인자를 두번 전달함 (인자의 주소를 전달함) rbp-18이 받아온 인자값이다. rbp-20도 받아온 인자이다. rbp-8부분에 u7fl(3JC=UkJGEhPk{q`/X5UzTI.t&A]2[rPM9 이거를 넣는거를 볼 수 있다. 페스워드값으로 strlen을 쓰는것을 볼 수 있다. (call sub_10b0 이 strlen이다.) strlen의 리턴값만큼 for문을 돌리는 것을 볼 수 있다. 그리고 rbp-20[i] = rbp-8[i..