일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 에밀 뒤르켐
- 코드엔진 베이직
- 자살론
- BoB 12기 최종합격 후기
- CodeEngn Basic 01
- malware
- bob
- 사회분업론
- 리버싱
- h4ckinggame
- 코드엔진 basic 5
- 철학
- Best of the Best
- 사회적 사실
- CodeEngn
- BoB 12기
- 디지털 포렌식 트랙
- CodeEngn Basic 5
- 논문리뷰
- 코드엔진
- codeengn basic rce 01
- Today
- Total
목록전체 글 (97)
woonadz :)
Serial 값이 5B134977135E7D13인 Name 을 찾는 문제이다. Name과 Serial을 입력받는 서브루틴 함수 시작 부분으로 이동하였다. 사용자의 Name 입력값을 스택에 담은 후에 그 주소를 EDI 레지스터로 옮겼다. Serial을 입력받는 서브루틴 함수로 들어가면 EAX 레지스터에 담긴 값(사용자가 입력한 Serial 값)과 ESI 레지스터에 담긴 값(사용자가 입력한 Name 값을 바탕으로 정답이 되는 Serial 값)을 비교한다. 즉, ESI 레지스터에 담길 값이 5B134977135E7D13 일 때 Name이 일치한다. 다시 거슬러 올라가 분석해보겠다. XOR 부분을 분석하면 다음과 같다. 10이랑 Xor => 5B 20이랑 Xor => 13 30이랑 xor => 49 10이랑 x..
Serial 값을 맞추는 문제 성공 문자열을 추정되는 곳으로 이동 GetDIgUtemTextA 함수를 호출한 후에 CMP 비교를 하고 실패 메시지박스로 이동하거나 계속해서 명령어를 실행시킨다. 사용자의 둘째 입력값을 CMP 구문에서 비교한다. 사용자의 나머지 입력값이 들어있는 부분의 주소를 ECX로 옮긴다. 위 함수에서 사용자의 특정값을 비교하여 1 또는 0을 반환하는 것으로 추정 함수 안 서브루틴으로 들어가보면 사용자가 입력한 나머지 값을 EDI 레지스터로 옮김 그 값을 ESI 레지스터로 옮김 비교할 값(5y)을 ESI 레지스터로 옮김 사용자의 나머지 값을 R3versing이라는 값과 해당 for문에서 비교하는 것으로 추정 사용자가 입력한 값 중 첫째값을 가장 마지막에 계산한다. 따라서 첫째값은 45이..
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 순) 특정 주소에서 값을 가져와 그 값을 ..
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..
작년 8월에 진행했던 봉사활동이지만 늦게나마 지난 시간의 느낀점 및 개선점을 정리하기 위해 글을 작성하게 되었습니다. 제 블로그의 글은 일기 형식이지만 유입이 많을 것으로 예상되어 해당 피드는 소개글 형식으로 작성합니다. 월드프렌즈 ICT 봉사단 지원 배경 ICT 봉사단 지원은 저의 대학 생활 목표로부터 시작됩니다..!! 2022년 기준 2학년이었던 저는 1학년 때부터 해당 프로그램을 알고 있었습니다! 1학년때는 지원기간을 놓쳤을 뿐더러 프로그래밍에 자신이 없었기 때문에 지원할 생각조차 하지 못했습니다. 더보기 1학년 1학기 파이썬 프로그래밍 중간고사에서 뒤에서 2등을 하고 방학 동안 백준 문제를 엄청 풀었습니다. 그 덕에 골드 수준까지는 풀 수 있는 실력이 되었습니다! 그 결과 1학년 2학기 C 프로그..
보호되어 있는 글입니다.
RCE L04 문제 RCE L04 문제풀이 Entry point 관련 정보를 찾을 수 없다. 패킹 된 것으로 추측된다. push 0으로 스택을 초기화하는 것으로 보아 해당 주소가 Original Entry point 이다. 패킹이 되어있어 어딘가에 BP를 걸어도 초기화되고 프로그램이 끝까지 실행된다. API를 찾는 방식으로 문제풀이를 진행하겠다. Ollydbg 시작 지점에서 한줄씩 실행시키면 해당 프로그램에서 사용하는 API가 담긴 주소 목록을 확인할 수 있다. lstrcmp 함수는 두개의 문자열을 비교할 때 사용하는 함수로 사용자가 입력한 serial과 하드코딩된 serial 값을 비교할 때 자주 사용되는 API이다. GetModuleHandleA API로 사용자가 입력한 Serial을 받아와서 lst..
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 함수를 실행..