pointer is partially stored in the stack

add dst, src instruction is used to add the value in the src (source) register to the dst (destination) register, and then store the result in the dst register.

The inc dst instruction in assembly language is a simple command used to increment the value stored in the dst (destination) register or memory location by one

not put instructions/execute any instructions in the stack

比如push 1234和push aaa=:

这里把string “aaaa = 1234” 的地址给了ebx, 寄存器ebx指向这个string的地址

 example: 0xbffff090 → “aaaa = 1234”, 

然后在下面push argument array env的时候 把每个寄存器都push到stack上

这个时候push进去stacks的是寄存器指向地址 比如说寄存器ebx指向的地址0xbffff090

接下来 mov edx ,esp 是让edx寄存器指向当前esp地址。 也就是说现在等于是

oxbffff060(esp指向的地址) → 0xbffff090(ebx指向的地址) → “aaaa = 1234” 

这就是一个地址指向一个地址地址

这之后push /bin/sh到stack里 然后mov ebx,esp。

这里等于是重新分配了ebx的地址 因为ebx之前指向的是string aaaa = 1234的地址 现在他重新分配了指向的是0xbffff054 也就是“/bin/sh”的地址

但是注意 edx指向的仍然是oxbffff060, 然后这个地址还是指向ebx之前的地址也就是

0xbffff090(string aaaa = 1234的地址)

也就是说即使ebx寄存器指向的地址变了 也不会影响到edx因为edx的地址是在ebx指向地址重新分配之前设定的。

汇编语言里 string的写法是4个bytes 因为这是 x86系统

所以在stack里argv[2] = "ls -la" 的写法是先push “la”push"ls -"

Gef调试代码:

pi import urllib.request as u, tempfile as t; g=t.NamedTemporaryFile(suffix='-gef.py'); open(g.name, 'wb+').write(u.urlopen('https://tinyurl.com/gef-main').read()); gdb.execute('source %s' % g.name)

shellcode生成代码:

objdump -d print_stk.o | grep '^ ' | cut -f2 | xargs | sed 's/ /\\x/g' | awk '{print "\"\\x"$0"\";"}'

我永远喜欢星姐/Mio唱歌