x86 write syscall 호출규약 질문
다른 분들 질문 통해서,
X86의 경우에는 스택에 순서대로 레지스터에 들어갈 값을 넣어둔 후, 콜 하기전에 POP 해서 레지스터로 넣은 후에 SYSCall을 실행한다고 보았는데요.
위는 write 호출 규약인데요
다른분들이 작성하신 공격코드랑 레지스터가 좀 다른 것 같은데 왜 그런가요?
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1) + p32(read_got) + p32(4)
payload += (read_plt)
코드대로 라면 esi = 1
edi = read_got
ebp = 0x04 가 되는 것 같은데
규약대로라면 ebx = 1 , edi = read_got , ebp=0x04가 되어야 하는것 같아서요
#pwnable
작성자 정보
답변
1
keyme
CTF Second Place
https://www.lazenca.net/display/TEC/01.ROP(Return+Oriented+Programming)-x86
Lanzenca ROP 글을 보면 "x86 바이너리에서는 pop 명령어의 피연산자 값은 중요하지 않습니다."라고 되있네요. 즉, pppr 가젯은 esp를 조작하기 위한 역할일 뿐이고 x64처럼 레지스터에 데이터를 저장하기 위한 역할이 아니라는 의미입니다. (x64 ROP와 x86 ROP의 차이라고 할 수 있죠.)
자세한 건 링크 글을 참고해보시면 좋을 것 같네요.