日志 7.12 pwn

记得风暴半小时先

c函数
  1. int atoi(const char *nptr)
    函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 [1] 。特别注意,该函数要求被转换的字符串是按十进制数理解的
//vs2013里调用printf函数请使用预处理命令#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char a[] = "-100";
    char b[] = "123";
    int c;
    c = atoi(a) + atoi(b);
    printf("c=%d\n", c);
    return 0;
}

执行结果:

c = 23
  1. char *strdup(char *s)
    功能: 将字符串拷贝到新建的位置处
    strdup()在内部调用了malloc()为变量分配内存。返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。

  2. __x86_get_pc_thunk_bx()
    在x86中开启了位置无关(PIE)的文件的函数开头会调用。
    它将代码的位置加载到%ebx寄存器中,从而允许全局对象(与代码有固定的偏移量)作为该寄存器的偏移量来访问。

调试技巧

  1. 查看文件权限找突破口
    gdb — 设置断点 — 运行 — vmmap — 对比gdb-readelf
    一般来说不会有rwx全开的段,如果有的话一般可以利用。
    之所以使用gdb查看不用readelf是因为readelf好像不会显示全?而gdb-peda会将rwx权限的地址空间标红,方便查看,同时对比常见的段位置即可知道哪些段被做过手脚了。

常用段的地址和权限:

.text 代码段 地址不定 r-x //重要
.data 数据段 地址不定 r
.rodata 只读数据段 地址不定 r--
.bss  0x0804040 rw- //重要
.plt 地址不定 r-w
.got.plt 0x0804a000 rw- //重要

[stack] 0xfffdd000 rw- //重要
  1. 一个字占两位地址
    一个字是8位即2个十六进制数,故一个字占地址两位,双字占四位地址。
    所以在调试数组下标的时候,注意每个数组元素大小

脚本技巧

  1. python.pwn.asm模块:将汇编转成机器语言(需要设置位数i386/amd64)
  2. python 'ob’为二进制数开头
  3. 自定义unsigned_int和int转化函数
    当有时题目返回的地址值是有符号数,需要转换
#int有符号转无符号
def intTouint(num,arch=32):
    return num & ((1 << arch) - 1)
    # return (bin(((1 << arch) - 1) & num)[2:]).zfill(arch)

#int无符号转有符号
def uintToint(num,arch=32):
    return num - (1<<arch)

其他

汇编语言中CS,DS,SS还有一个ES定义如下:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值