일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Best of the Best
- 논문리뷰
- 철학
- 리버싱
- codeengn basic rce 01
- 사회분업론
- CodeEngn
- 자살론
- BoB 12기
- BoB 12기 최종합격 후기
- 코드엔진
- 에밀 뒤르켐
- 디지털 포렌식 트랙
- CodeEngn Basic 01
- malware
- 사회적 사실
- h4ckinggame
- bob
- 코드엔진 베이직
- CodeEngn Basic 5
- 코드엔진 basic 5
- Today
- Total
목록IT (87)
woonadz :)
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/spfrE/btr9GgHF7Xg/gZteh2L6Ya0EcruCRYrRc0/img.png)
DreamHack의 basic reversing 시리즈는 전체적인 로직은 같고, 입력값을 기반으로 serial과 비교하는 부분의 로직이 다르기 때문에 그 부분부터 설명한다. 문자열 참조를 통해 Input 값을 받아 serial 일치 여부를 판단하는 함수가 있는 곳으로 이동했다. rsp 값을 옮긴 rax 레지스터의 값과 18을 비교하는 것으로 보아 serial은 24자리라는 것을 추측할 수 있다. 사용자 입력값을 eax 레지스터에 옮긴다. 16진수 기준으로 0부터 17까지 증가하는 rsp 레지스터의 값을 ecx 레지스터에 옮기고 +1 을 한다. 사용자의 다음 입력값을 ECX 레지스터로 옮긴다. 사용자의 입력값을 더한다. (abcdefg라면 a+b, b+c, c+d 순) 특정 주소에서 값을 가져와 그 값을 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dQZxmV/btr8ibNfBVF/QzyZ8P8BYCxAt3Kcy7fOKk/img.png)
DreamHack의 basic reversing 시리즈는 전체적인 로직은 같고, 입력값을 기반으로 serial과 비교하는 부분의 로직이 다르기 때문에 그 부분부터 설명한다. 1C와 비교하는 것으로 보아 총 28자리의 serial인 것을 추측할 수 있다. sar 명령어는 오늘 처음 보았다. sar : 오른쪽으로 밀어 낮은 bit를 내보내고 Carry Flag로 복사, 높은 bit 쪽에 0을 더하여 채운다. But keep sign(1) 해야한다. 사용자가 입력한 첫 값에 대해 위와 같이 계산한다. shl : 왼쪽으로 밀어(shift) 높은 bit를 내보내고 Carry Flag로 복사 낮은 bit쪽에 0을 더하여 채운다. 사용자가 입력한 첫 값에 대해 위와 같이 계산한다. shl 연산을 한 값과 F0을 an..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/T9Nxs/btrUfggN66g/rckCdXyz7eOqFT4BqkSujk/img.png)
RCE L04 문제 RCE L04 문제풀이 Entry point 관련 정보를 찾을 수 없다. 패킹 된 것으로 추측된다. push 0으로 스택을 초기화하는 것으로 보아 해당 주소가 Original Entry point 이다. 패킹이 되어있어 어딘가에 BP를 걸어도 초기화되고 프로그램이 끝까지 실행된다. API를 찾는 방식으로 문제풀이를 진행하겠다. Ollydbg 시작 지점에서 한줄씩 실행시키면 해당 프로그램에서 사용하는 API가 담긴 주소 목록을 확인할 수 있다. lstrcmp 함수는 두개의 문자열을 비교할 때 사용하는 함수로 사용자가 입력한 serial과 하드코딩된 serial 값을 비교할 때 자주 사용되는 API이다. GetModuleHandleA API로 사용자가 입력한 Serial을 받아와서 lst..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bJAoWE/btrRnoppNlo/QQEXM7YPHq84b0KBsLE3f1/img.png)
RCE L03 문제 RCE L03 문제 풀이 GetDlgItemTextA 함수 dialog box에서 제어와 관련된 제목이나 텍스트를 검색한다. UINT GetDlgItemTextA( [in] HWND hDlg, [in] int nIDDlgItem, [out] LPSTR lpString, [in] int cchMax ); 함수가 성공하면 반환 값은 종료 null 문자를 포함하지 않고 버퍼에 복사된 문자 수를 지정한다. 함수가 실패하면 반환 값은 0이다. 메모리를 확인하면 keygen 에 관한 내용이 나오는 것을 확인할 수 있다. (문자열 검색에서도 확인 가능하다.) 함수의 매개변수에 적혀있는 버퍼의 주소로 들어가면, 필자가 입력한 시리얼 값을 불러온 것을 확인할 수 있었다. wsprintfA 함수를 실행..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dNsuoD/btrRn5WGRNF/lt8kFQufsM2TCxUCyUtHx1/img.png)
CodeEngn Advance RCE L02 CodeEngn Advance RCE L02 문제풀이 OllyDBG에 RCE L02 파일을 올리자마자 실행이 된다. IS와 EAX 레지스터에 값이 들어있지 않는 것으로 보아 이 중 하나의 값이 플래그일 것으로 예상했다. 또한 두번의 반복을 수행하고 해당 주소에서 비정상적으로 프로그램 작동이 중지된다. (이때까지는 '정답'이 잘못실행된 함수를 제대로 실행시키는 것인줄 알았다.)
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ck27Tc/btrQMxHMhad/jpm01wSbStyqqGDQDOkToK/img.png)
문제 from Crypto.Util.number import bytes_to_long, getPrime flag = bytes_to_long(b'DH{???????????????????????????????????????????????????????}') p1 = getPrime(420) p2 = getPrime(420) p3 = getPrime(420) print(f'p1 = {p1}') print(f'p2 = {p2}') print(f'p3 = {p3}') print(f'c1 = {flag % p1}') print(f'c2 = {flag % p2}') print(f'c3 = {flag % p3}') output p1 = 152720747024314397374153010591098602427164998..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c0cfCx/btrP90cyixo/LKynm2k2jTk4iQkgB4rVg1/img.png)
CodeEngn Advance RCE L01 문제 CodeEngn Advance RCE L01 문제풀이 UPX로 패킹되었다는 것을 알 수 있다. 언패킹 후 Ollydbg에 올려 분석해보겠다. 이러한 경고창은 안티디버깅 기술이 exe 파일에 포함되어있을 경우 실행된다고 한다. 안티디버깅 기술을 우회하기 위해 해당 주소에서 부르는 함수 안으로 들어가보겠다. IsDebuggerPresent() 함수는 안티디버깅 함수이다. https://learn.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent IsDebuggerPresent function (debugapi.h) - Win32 apps Determines whether ..
보호되어 있는 글입니다.