목록Computer App Penetesting (45)
외로운 Nova의 작업실
- 문제인식 먼저 실행해보겠습니다. 3번째 remove me! 라고 되어있고 nagnag라고 있습니다. 이부분 메시지를 지우면 되는것 같습니다. - 크랙 설계 메시지를 만드는 함수를 call하는 부분을 찾아서 검증하고 없애줍니다. - 리버싱 근데 코드가 너무 간단합니다. - 크랙 nagnag 출력부분을 다 nop으로 만들어버립니다.
- 문제 인식 먼저 실행시켜보겠습니다. 아무래도 키젠프로그램들이니 1234로 키값을 넣어보겠습니다. 그랬더니 이렇게 뜹니다. 이렇게 안뜨고 정상실행하는게 목표인 것 같습니다. - 크랙 설계 먼저 문자열을 비교하는 함수가 무조건 있을 것입니다. strcmp, cmp 등등이 있을겁니다. 이를 어셈블리에서는 call 명령어로 함수를 불러낼 것입니다. 따라서 call 명령어를 검색해서 문자열을 비교하는 부분에 bp를 걸고 어떻게 비교하는지 알아내거나 비교후 점프문을 크랙해보도록 하겠습니다. - 리버싱 search for - all intermodular calls를 눌러 모든 call 하는 함수들을 검색합니다. 그럼 딱봐도 strcmp 함수가 보입니다. 여기에 bp를 걸고 F9로 run 해줍니다. 이후 1234..
- 버추얼박스 설치 및 우분투 설치 https://mainia.tistory.com/2379 버추얼박스(VirtualBox) 이용해서 우분투(Ubuntu) 설치하기 버추얼박스(VirtualBox) 를 이용해서 다양한 OS 를 자신의 컴퓨터에 설치할 수 있습니다. 저는 직업 특성상 리눅스 OS 를 접할 일이 많습니다. 별도로 컴퓨터를 마련해서 리눅스 테스트 환경을 갖추 mainia.tistory.com 이후 화면 크기 설정을 VboxVGA로 변경해야 비율에 맞게 잘 커집니다. - 공유 폴더 만들기 https://www.manualfactory.net/11052 버추얼박스 / 공유 폴더 만드는 방법 버추얼박스에서 호스트와 게스트 간 파일을 주고 받는 방법 중 가장 쉬운 것은 드래그 앤 드롭을 이용하는 것입니..
보호되어 있는 글입니다.
이번 장에서는 크랙미 10을 크랙해보겠습니다. - 문제 파악 한번 실행해보겠습니다. 시리얼을 입력하고 check 버튼을 눌러서 확인하는 것같다는 생각이듭니다. 1234를 넣고 check버튼을 눌러보겠습니다. wrong으로 틀리다고 나옵니다. 이번 문제도 시리얼 넘버를 맞추는 문제인것 같다는 생각이듭니다. - 리버싱 먼저 올리디버거로 리버싱해보겠습니다. F9를 눌러서 프로그램의 시리얼값을 받을때 pause 되어야되지만 실제 F9를 누르면 프로그램이 종료가됩니다. 이는 첫번째 실행되는 코드부분에서 디버깅되었는지 확인하는 코드때문입니다. CPU Disasm Address Hex dump Command Comments 00401000 /$ E8 37020000 CALL ; [KERNEL32.IsDebuggerP..
이번 문서에는 c++를 어셈블리어로 변환했을때 어떻게되는지 정리해보겠습니다. - 클래스 정적 할당 #include #include #include class Employee { public : int number; wchar_t name[128]; long pay; void ShowData(); void Test(); }; void Employee::ShowData() { printf("number: %d\n", number); printf("name : %s\n", name); printf("pay : %d\n", pay); Test(); return; } void Employee :: Test() { printf("Test function\n"); return; } int main() { Employ..
이번 포스팅은 c언어와 어셈블리사이의 관계에대해서 정리하겠습니다. 특히, if문 for문 case문이 어떻게 어셈블리어로 변환되는지 보겠습니다. 실습환경은 윈도우 10 64비트입니다. - if문 #include int main() { int a = 1; int b = 0; if (a == 1) { a++; } else { b++; } return 0; } #include int main() { 00007FF628941750 push rbp 00007FF628941752 push rdi 00007FF628941753 sub rsp,128h 00007FF62894175A lea rbp,[rsp+20h] 00007FF62894175F lea rcx,[__F4170C15_test@cpp (07FF62895100..
안녕하세요. 이번시간에는 드림핵 Return to Shellcode 문제풀이를 해보도록 하겠습니다. - 문제인식 강의해서 실습하는 거라 별다른 문제정보는 없습니다. 특히나 지금 wsl로는 실행파일을 다운로드 하지 못해서 checksec을 하기 어려운 부분이 있으므로 강의를 참고하겠습니다. 환경을 보게되면 amd64 아키텍쳐 즉 x8-64 명령어 셋을 사용하고 있습니다. Full RELRO로 BSS를 제외한 곳에 write이 안되지만 스택을 건드릴 것이므로 괜찮습니다. 카나리를 사용중이고 NX가 사용중이지 않아서 스택에 쉘코드를 넣고 실행해야할 것 같습니다. PIE가 실행중이여서 실행마다 buf의 주소는 변할 것 같습니다. 이제 코드를 보겠습니다. // Name: r2s.c // Compile: gcc -..
리버싱 엔지니어링 바이블에서 나온 함수호출 규약을 간단히 정리해보려고합니다. - 함수 호출 규약 __cdecl : 호출자가 스택을 정리합니다. __stdcall : 피호출자가 스택을 정리합니다. __fastcall : 인자가 2개라면 ecx와 edx를 사용합니다. __thiscall : c++에서 자주사용하는 함수로 ecx에 this 포인터가 담깁니다.
- 카나리 스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법입니다. 카나리 값의 변조가 확인되면 프로세스는 강제로 종료됩니다. 카나리값의 첫번째 값은 leak을 방지하기위해 보통 null값입니다. - 카나리 할당 과정 1. 프로세스는 프로그램을 실행하고 카나리를 fs 세그먼트의 주소값을 설정합니다. 이때 fs 주소값이 설정되면 시스템은 arch_prctl()함수를 호출합니다. 2. 이후 fs 세그먼트 공간이 확보되면 프로그램이 작동하면서 fs세그먼트 시작부분으로부터 0x28번째 공간에 임의의 값으로 넣습니다. 3. 이후 카나리를 사용해야하는 프로그램은 이 카나리값을 사용합니다. - 카나리가 적용된 프로그램과 미..