1、Arrays
P → 5 * i + j
Q → 4 * j + i
M = 4
N = 5
2、Structures
A
p : 8 ~ 15
c : 16
dl.x : 24 ~ 31
dl.y : 32 ~ 39
next : 40 ~ 47
B
6 * 8 = 48
C
“i” + 24 → “i” + 8
“i” + 24 → “i” + 32
“i” → “i” +40
- st->p = st->dl.x
- st->dl.y = st->dl.x
- st->next = st
3、Union
expr | type | Code |
---|---|---|
up->t1.u | int | movl (%rdi), %eax movl %eax, (%rsi) |
up->t1.v | char | movb 4(%rdi), %eax movb %eax, (%rsi) |
&up->t1.w | long * | addq $5, %rdi movq %rdi, (%rsi) |
up->t2.c | char * | movq %rdi, (%rsi) |
up->t2.a | short * | movq 4(%rdi), (%rsi) |
up->t2.a[up->t1.w] | short | movq 8(%rdi), %eax movw 4(%rdi, %eax, 1), %rax movw %rax, (%rsi) |
*up->t2.p | int | movq 8(%rdi), %eax movl (%eax), %rax movl %rax, (%rsi) |
4、Overflow
A
B
strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,可以利用这点进行绕过检查。
通过输入超过长度的字符串使之溢出即可。