got挟持

31 阅读2分钟

好像还是pwn的题,需要分析函数的地址

if ( !strcmp(a2[1], "zer0pts{CENSORED}") )

  puts("Correct!");
else
  puts("Wrong!");
  假的
  

3092507-20230930122933826-1852670353.png 照例翻一下 发现一个函数

eak3kx0y.bmp 继续分析

7jklj0rz.bmp for ( i = 0LL; i != v4; ++i ) ((void (__fastcall )(_QWORD, __int64, __int64))(&funcs_889 + i))(a1, a2, a3);

从&func_889开始调用了一系列函数,去到此处

y9m12gma.bmp 逐一查看,在sub_795中

spr54lv1.bmp strcmp()函数位置修改了qword——201090 更进查看off_201028

image.png 是strcmp在plt表中位置,被修改为了sub_6ea

故调用strcmp实际是sub-6ea

字符串大数加减法

转换为字节再运算 image.png 计算字符串长度,长度33>>3+1==5,4字节减1060【j】内数据 小端存储 高-->低

将字符转换为dword

# enc=[ 0, 4686632258374338882, 796841318371695088, 5695428477452625963, 0]
# str='zer0pts{********CENSORED********}'
# print(len(str))
# ant=[  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x09,
#   0x4A, 0x49, 0x35, 0x43, 0x0A, 0x41, 0xF0, 0x19, 0xE6, 0x0B,
#   0xF5, 0xF2, 0x0E, 0x0B, 0x2B, 0x28, 0x35, 0x4A, 0x06, 0x3A,
#   0x0A, 0x4F, 0x00]
# print(len(ant))
# flag=''
# for i in range(33):
#   flag+=chr(ord(str[i])+ant[i])
# print(flag)

import binascii
enc = "********CENSORED********"
key = [0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B]
flag = b''  # 创建一个字节型变量
# p = enc[1 * 8:(1 + 1) * 8]
# a = binascii.b2a_hex(p.encode('ascii')[::-1])                 #为了对应key的小端存储
# print(a)
# print(int(a,16))                                              #之前a是变成是16进制于是要转次10进制与key相加
# print(key[1])                                                 #从数组里取出来默认是10进制
# b = binascii.a2b_hex( hex(int(a,16) + key[1])[2:] )[::-1]     #现在是高到低的显示 但显示字符串还是得低到高??
# print(b)
for i in range(len(key)):
  p = enc[i * 8:(i + 1) * 8][::-1]
  a = binascii.b2a_hex(p.encode('ascii'))
  b = binascii.a2b_hex(hex(int(a, 16) + key[i])[2:])[::-1]
  flag += b
print(flag)