文章目錄
  1. 1. 安云的pwn题
    1. 1.1. 思路
    2. 1.2. ELF心得
    3. 1.3. 溢出心得
    4. 1.4. 失败尝试
    5. 1.5. 问题

安云的pwn题

思路

  1. 运行shellcode
  2. 打开了NX咋办。有mprotect
  3. 把shellcode放到bss
  4. 怎么放?gets

ELF心得

  1. ELF加载的过程中有linker view和loader view,linker view处理segments,而loader view处理sections。
  2. ELF文件的有的segments会被加载到内存里,并页对齐,因此可利用的bss大小不止40字节,因为页大小大于段大小
  3. sections可以出现在多个segement里(换句话说,一个section可能在link阶段有多种需求)

溢出心得

  1. fgets/gets函数,如果需要写入\x00还算好解决,可以分多次写入;但是\x0a不好解决,在遇到\x0a之后,会停止读入,并在\x0a后加上\x00。因此dump libc的时候,找到base很容易(因为4K对齐),但是找system和/bin/sh就挺困难了),这个问题要学习一下别人是怎么解决的
  2. 字符串格式化写(输入函数scanf,gets等,输出函数printf等都用了,因为写进服务器内存既可以用scanf系,也可以用printf的%n):
    a. 写到任意地址,需要先写入一个地址作为指针,然后利用%n(或%hn,%hhn还可以只写一个字节),对\x0a和\x00比较友好,单个字节写入解决了这个问题
    b. 写到任意地址,通过普通栈溢出方法(%$n修改返回地址),修改ret为gets等,对\x0a和\x00不太友好,但是可以批量,这道题就用了gets写shellcode
    c. 作为stdin,写到栈上(不利用字符串格式化)(可以给a作铺垫),对\x0a和\x00不太友好
    d. 改got表,比较传统了
  3. 字符串格式化读(输入函数scanf,gets等,输出函数printf等都用了,因为要把我们的格式化字符串s上传上去,然后才被printf打印):
    a. 读栈的高地址的内容,比较容易,因为没有\x00和\x0a的烦恼
    b. 读栈上高地址处的指针指向的内容%$s,不如a容易,(一种不太好思路是用字符串格式化写,写进一个地址,但是不好实现),writeup放弃了打印出libc或system,而只找了相对容易找的bss,绕过这个问题。
    c. ?

失败尝试

  1. 尝试使用libcdb。libcdb已经很久不更新了,所以然并卵
  2. 尝试dump处libc失败了,

问题

  1. 不明白为什么pwntools的DynELF总是会读到section的外边,然后失败。
文章目錄
  1. 1. 安云的pwn题
    1. 1.1. 思路
    2. 1.2. ELF心得
    3. 1.3. 溢出心得
    4. 1.4. 失败尝试
    5. 1.5. 问题