最近刚开始学习pwn,因为看到有python3版本的pwntools。就安了一下,记录一下目前遇到的坑。

  1. _curses moudle not found

  2. TypeError:can only concatenate str

一、_curses

搜索了很多,都是windows下python缺少_curses库的,显然wsl无法用这个方法解决。最后终于找到一个解决方案,链接如下

https://my.oschina.net/leejun2005/blog/167567

针对linux的方案:

  1. sudo pip install curses-2048

  2. 动态链接库(_curses_panel.so
    _curses.so)的位置不对或者没有创建动态链接库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    find / -iname "_curses*.so" 2>/dev/null
    /usr/lib64/python2.6/lib-dynload/_curses.so
    /usr/lib64/python2.6/lib-dynload/_curses_panel.so

    find / 2>/dev/null | grep 'python2.7/lib-dynload'|head -2
    /opt/soft/python-2.7.11/lib/python2.7/lib-dynload
    /opt/soft/python-2.7.11/lib/python2.7/lib-dynload/math.so

    cp /usr/lib64/python2.6/lib-dynload/_curses*.so /usr/local/lib/python2.7/lib-dynload/

    find / -iname "_curses*.so" 2>/dev/null
    /usr/lib64/python2.6/lib-dynload/_curses_panel.so
    /usr/lib64/python2.6/lib-dynload/_curses.so
    /usr/local/lib/python2.7/lib-dynload/_curses_panel.so
    /usr/local/lib/python2.7/lib-dynload/_curses.so

    这样就能让python找到相应的so文件。

二、TypeError

python3里bytes类型和str类型是两个不同的类型,而不是像py2里面作为同一个类型的两个名字。因此在诸如”A“ * N + p64(Addr)这种形势的payload构造时,会出现问题。

查了好久发现在pwntools github的issue中有一个解答。

对所有要 xx.send()的字符串 要用'latin-1'进行编码。将其变成bytes类型后进行拼接。

最后的结果就是

bytes("A", 'latin-1') * N + p64(Addr)